c# - 确定反射类型是否可以转换为另一个反射类型

标签 c# .net reflection

在 .net (C#) 中,如果通过反射发现了两种类型,是否可以确定一种类型是否可以转换为另一种类型? (隐式和/或显式)。

我想做的是创建一个库,允许用户指定将一种类型的属性映射到另一种类型的属性。如果这两个属性具有匹配的类型,一切都很好,但我希望能够允许它们映射可以使用隐式/显式转换的属性。所以如果他们有

class from  
{
  public int IntProp{get;set;}
}

class to
{
  public long LongProp{get;set;}
  public DateTime DateTimeProp{get;set;}
}

他们可以说 from.IntProp 将被分配给 to.LongProp(因为存在隐式转换)。但如果他们说它映射到 DateTimeProp,我就能够确定没有可用的转换并抛出异常。

最佳答案

public static bool HasConversionOperator( Type from, Type to )
        {
            Func<Expression, UnaryExpression> bodyFunction = body => Expression.Convert( body, to );
            ParameterExpression inp = Expression.Parameter( from, "inp" );
            try
            {
                // If this succeeds then we can cast 'from' type to 'to' type using implicit coercion
                Expression.Lambda( bodyFunction( inp ), inp ).Compile();
                return true;
            }
            catch( InvalidOperationException )
            {
                return false;
            }
        }

这应该可以实现隐式和显式转换(包括数字类型、类等)

关于c# - 确定反射类型是否可以转换为另一个反射类型,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/292437/

相关文章:

C# - AdjustTokenPrivileges 不适用于 32 位

c# - UdpClient.EnableBroadcast 值无效

java - 不满意的依赖异常 : Error creating bean with name 'trafficMapper'

c# - 传入 XML 大小写敏感问题

c# - 在 C# 项目中使用伪变量

javascript - 在运行时用来自indexeddb的数据填充cshtml

Kotlin:使用反射设置带注释的 Lateinit var

reflection - golang 获取类型的 reflect.Type

c# - 带有 DynamicParameters 的 Dapper 自定义 TypeHandler

c# - 异步 WCF 调用来保存线程?