我有几个PropertyInfo
个对象,它们代表目标对象的属性。还有一组类似的PropertyInfo
个对象,它们代表了源对象的属性。
如果名称和类型匹配,我的代码会将属性值从源分配给目标。但是有些类型是可分配的但不完全匹配。其中一种情况是Int16
类型的源属性,但在目标端,同名属性的类型为Int32
。我使用targetProperty.Type.IsAssignableFrom(sourceProperty.Type)。
所以换句话说,以下是返回false,而我真的希望它给我一个'true'
typeof(Int32).IsAssignableFrom(typeof(Int16))
我已阅读其他帖子,告诉我IsAssignableFrom不是我需要的。在我开始编写一个很长的switch-case代码之前,我正在检查是否有更简单的方法。
答案 0 :(得分: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;
}
答案 1 :(得分:0)
Int32 (int)
和Int16 (short)
是Structs。结构不允许继承。因此IsAssignableFrom
不起作用,因为short
不会从int
继承。但是将short
分配给int
是没有问题的。