我有几个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不是我所需要的。在继续编写冗长的开关案例代码之前,我正在检查是否有更简单的方法。
从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)