我如何确定Int32实际上可以从Int16分配

fah*_*ash 1 c# reflection

我有几个PropertyInfo对象代表目标对象的属性。还有一组类似的PropertyInfo对象,它们代表源对象的属性。

如果名称和类型匹配,我的代码将从源向目标分配属性值。但是某些类型是可分配的,但不能完全匹配。一种情况是source属性的类型,Int16但在目标端,同名属性是type的Int32。我使用targetProperty.Type.IsAssignableFrom(sourceProperty.Type)

换句话说,当我真的希望它给我一个“ true”时,以下返回false

typeof(Int32).IsAssignableFrom(typeof(Int16))
Run Code Online (Sandbox Code Playgroud)

我读过其他线程,它们提示我IsAssignableFrom不是我所需要的。在继续编写冗长的开关案例代码之前,我正在检查是否有更简单的方法。

Kyl*_*yle 5

Int16到的隐式转换Int32是C#语言功能,不是CLR或.NET的功能,因此从技术上讲它们不是可在运行时分配的(尽管,公平地IsAssignableFrom说,object即使您在技术上需要,也可以从任何值类型进行分配)进行拳击转换)。

除了发出如下这样的大喇叭声开关语句外,我没有其他方法可以做到:

public static bool HasImplicitConversion( Type source, Type destination )
{
    var sourceCode = Type.GetTypeCode( source );
    var destinationCode = Type.GetTypeCode( destination );
    switch( sourceCode )
    {
        case TypeCode.SByte:
            switch( destinationCode )
            {
                case TypeCode.Int16:
                case TypeCode.Int32:
                case TypeCode.Int64:
                case TypeCode.Single:
                case TypeCode.Double:
                case TypeCode.Decimal:
                    return true;
            }
            return false;
        case TypeCode.Byte:
            switch( destinationCode )
            {
                case TypeCode.Int16:
                case TypeCode.UInt16:
                case TypeCode.Int32:
                case TypeCode.UInt32:
                case TypeCode.Int64:
                case TypeCode.UInt64:
                case TypeCode.Single:
                case TypeCode.Double:
                case TypeCode.Decimal:
                    return true;
            }
            return false;
        case TypeCode.Int16:
            switch( destinationCode )
            {
                case TypeCode.Int32:
                case TypeCode.Int64:
                case TypeCode.Single:
                case TypeCode.Double:
                case TypeCode.Decimal:
                    return true;
            }
            return false;
        case TypeCode.UInt16:
            switch( destinationCode )
            {
                case TypeCode.Int32:
                case TypeCode.UInt32:
                case TypeCode.Int64:
                case TypeCode.UInt64:
                case TypeCode.Single:
                case TypeCode.Double:
                case TypeCode.Decimal:
                    return true;
            }
            return false;
        case TypeCode.Int32:
            switch( destinationCode )
            {
                case TypeCode.Int64:
                case TypeCode.Single:
                case TypeCode.Double:
                case TypeCode.Decimal:
                    return true;
            }
            return false;
        case TypeCode.UInt32:
            switch( destinationCode )
            {
                case TypeCode.UInt32:
                case TypeCode.UInt64:
                case TypeCode.Single:
                case TypeCode.Double:
                case TypeCode.Decimal:
                    return true;
            }
            return false;
        case TypeCode.Int64:
        case TypeCode.UInt64:
            switch( destinationCode )
            {
                case TypeCode.Single:
                case TypeCode.Double:
                case TypeCode.Decimal:
                    return true;
            }
            return false;
        case TypeCode.Char:
            switch( destinationCode )
            {
                case TypeCode.UInt16:
                case TypeCode.Int32:
                case TypeCode.UInt32:
                case TypeCode.Int64:
                case TypeCode.UInt64:
                case TypeCode.Single:
                case TypeCode.Double:
                case TypeCode.Decimal:
                    return true;
            }
            return false;
        case TypeCode.Single:
            return ( destinationCode == TypeCode.Double );
    }
    return false;
}
Run Code Online (Sandbox Code Playgroud)