C# 检查一个对象是否可以强制转换为另一个对象失败

本文关键字:一个对象 转换 失败 检查 是否 | 更新日期: 2023-09-27 18:30:20

我正在尝试使用 IsAssignableFrom 检查对象是否可以转换为某种类型。但是我没有得到预期的结果...我在这里错过了什么吗?

//Works (= casts object)
(SomeDerivedType)factory.GetDerivedObject(); 
//Fails (= returns false)
typeof(SomeDerivedType).IsAssignableFrom(factory.GetDerivedObject().GetType()); 

编辑:

上面的例子似乎是错误的,不能很好地反映我的问题。

我在代码中有一个DerivedType对象,它被强制转换为BaseType

BaseType someObject = Factory.GetItem(); //Actual type is DerivedType

通过反思,我还有一个PropertyType

PropertyInfo someProperty = entity.GetType().GetProperties().First()

我想检查someObject是否可以分配给(可铸造)someProperty PropertyType.我该怎么做?

C# 检查一个对象是否可以强制转换为另一个对象失败

当你有

 class B { }
 class D : B {} 

然后

typeof(B).IsAssignableFrom(typeof(D))   // true
typeof(D).IsAssignableFrom(typeof(B))   // false

我认为您正在尝试第二种形式,这并不完全清楚。

最简单的答案可能是测试:

 (factory.GetDerivedObject() as SomeDerivedType) != null

编辑后:

你想知道的不是某个对象是否可以分配给某个属性,而是它是否可强制转换

基础是:

bool ok = someProperty.PropertyType.IsInstanceOfType(someObject);

但这只处理继承。

尝试使用

if (factory.GetDerivedObject() is SomeDerivedType)
{
//do
}

var tmp = factory.GetDerivedObject() as SomeDerivedType;
if (tmp != null)
{
//do
}

由于我看到您的GetDerivedObject()不是通用的,并且您必须将其结果显式转换为SomeDerivedType,因此我假设GetDerivedObject被定义为返回SomeDerivedType的基本类型(在极端情况下,object)。

如果是这样,则此行:

typeof(SomeDerivedType).IsAssignableFrom(factory.GetDerivedObject().GetType());

翻译为

typeof(SomeDerivedType).IsAssignableFrom(SomeBaseType);

这通常是错误的,因为您无法将基类型分配给派生类型(您需要显式强制转换,这就是您所做的)。

试试这个。它可能会起作用。它可能需要一些小的更改才能编译。

TypeBuilder b1 = moduleBuilder.DefineType(factory.GetDerivedObject().GetType().Name, TypeAttributes.Public, typeof(SomeDerivedType));
typeof(SomeDerivedType).IsAssignableFrom(b1))