检查类型是否支持使用.NET将隐式或显式类型转换为其他类型

mea*_*ode 8 c# reflection type-conversion

想象一下,您已经获得了两个System.Type,并且您想确定是否存在从一个到另一个的隐式或显式类型转换.

如果没有专门检查静态方法,是否有内置方法来确定该类型是支持这些转换还是这些转换?

我知道这是一个简短的问题,但我认为这个场景相对容易解释,如果不是,请告诉我.

斯蒂芬,提前谢谢.

Qua*_*ter 8

Expression.Convert可以查找用户定义的转换运算符,但不幸的是,如果没有找到,它只会抛出异常.你可以像这样使用它:

public static bool CanConvert(Type fromType, Type toType)
{
    try
    {
        // Throws an exception if there is no conversion from fromType to toType
        Expression.Convert(Expression.Parameter(fromType, null), toType);
        return true;
    }
    catch
    {
        return false;
    }
}
Run Code Online (Sandbox Code Playgroud)

  • @meandmycode:如果你想在没有异常开销的情况下实现相同的东西,你可以在Expression.Convert上运行Reflector来查看它的确切功能.有趣的方法是System.Dynamic.Utils.TypeUtils中的HasIdentityPrimitiveOrNullableConversion,HasReferenceConversion和GetUserDefinedCoercionMethod. (2认同)

Dan*_*Tao 7

我不这么认为.你将使用反射并在每种类型上寻找那些好的ol' op_Implicitop_Explicit静态方法.

这提出了一个非常有趣的问题:哪个具有更大的性能影响,反射(这个答案)或使用控制流异常(Quartermeister)?老实说,我无法猜测.您可能想要对每个人进行分析并自行查找.