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

时间:2015-05-06 15:11:56

标签: c# reflection

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

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

所以换句话说,以下是返回false,而我真的希望它给我一个'true'

typeof(Int32).IsAssignableFrom(typeof(Int16))

我已阅读其他帖子,告诉我IsAssignableFrom不是我需要的。在我开始编写一个很长的switch-case代码之前,我正在检查是否有更简单的方法。

2 个答案:

答案 0 :(得分:5)

Int16Int32的隐式转换是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;
}

答案 1 :(得分:0)

Int32 (int)Int16 (short)是Structs。结构不允许继承。因此IsAssignableFrom不起作用,因为short不会从int继承。但是将short分配给int是没有问题的。