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
.我该怎么做?
当你有
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))