簡體   English   中英

我如何確定Int32實際上可以從Int16分配

[英]How do I determine Int32 is in fact assignable from Int16

我有幾個PropertyInfo對象,它們代表目標對象的屬性。 還有一組類似的PropertyInfo對象,它們代表源對象的屬性。

如果名稱和類型匹配,我的代碼將從源向目標分配屬性值。 但是某些類型是可分配的,但不能完全匹配。 一種情況是Int16類型的源屬性,但在目標端,同名屬性是Int32類型。 我使用targetProperty.Type.IsAssignableFrom(sourceProperty.Type)

換句話說,當我真的希望它給我一個“ true”時,以下返回false

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

我讀過其他線程,它們提示我IsAssignableFrom不是我所需要的。 在繼續編寫冗長的開關案例代碼之前,我正在檢查是否有更簡單的方法。

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;
}

Int32 (int)Int16 (short)是結構。 結構不允許繼承。 因此IsAssignableFrom不起作用,因為short不能從int繼承。 但是將short分配給int沒有問題。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM