如何确定C#中是否存在隐式转换?

我有两种类型,T和U,我想知道一个隐式cast运算符是否从T定义为U.

我知道IsAssignableFrom的存在,这不是我正在寻找的,因为它不处理隐式转换。

有一点谷歌让我到了this solution,但在作者自己的话这是丑的代码(它尝试隐式转换,如果有异常返回false,否则为true)

似乎测试存在具有正确签名won’t work for primitive types的op_Implicit方法。

是否有更清晰的方法来确定隐式cast运算符的存在?

您可以使用反射来找到目标类型的隐式转换方法:

public static bool HasImplicitConversion(Type baseType, Type targetType)
{
    return baseType.GetMethods(BindingFlags.Public | BindingFlags.Static)
        .Where(mi => mi.Name == "op_Implicit" && mi.ReturnType == targetType)
        .Any(mi => {
            ParameterInfo pi = mi.GetParameters().FirstOrDefault();
            return pi != null && pi.ParameterType == baseType;
        });
}

你可以这样使用:

class X {}
class Y
{
    public static implicit operator X (Y y)
    {
        return new X();
    }

    public static implicit operator Y (X x)
    {
        return new Y();
    }
}

// and then:
bool conversionExists = HasImplicitConversion(typeof(Y), typeof(X));

请注意,这仅检查基类型(第一个传递类型)的隐式类型转换。在技​​术上,类型转换也可以在其他类型上定义,因此您可能需要再次调用类型反转(或将其构建到方法中)。两种类型的隐式类型转换可能不存在。

http://stackoverflow.com/questions/32025201/how-can-i-determine-if-an-implicit-cast-exists-in-c

本站文章除注明转载外,均为本站原创或编译
转载请明显位置注明出处:如何确定C#中是否存在隐式转换?