![](/img/trans.png)
[英]Converting to int16, int32, int64 - how do you know which one to choose?
[英]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不是我所需要的。 在繼續編寫冗長的開關案例代碼之前,我正在檢查是否有更簡單的方法。
從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;
}
Int32 (int)
和Int16 (short)
是結構。 結構不允許繼承。 因此IsAssignableFrom
不起作用,因為short
不能從int
繼承。 但是將short
分配給int
沒有問題。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.