我正在尝试使用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
是否可分配给(可投递到)PropertyType
的{{1}}。我该怎么做?
答案 0 :(得分:5)
当你有
时 class B { }
class D : B {}
然后
typeof(B).IsAssignableFrom(typeof(D)) // true
typeof(D).IsAssignableFrom(typeof(B)) // false
我认为你正在尝试第二种形式,但并不完全清楚。
最简单的答案可能是测试:
(factory.GetDerivedObject() as SomeDerivedType) != null
编辑后:
如果someObject可以分配给SomeProperty但是它是 castable ,那么你想知道的不是。
基础是:
bool ok = someProperty.PropertyType.IsInstanceOfType(someObject);
但这只处理继承。
答案 1 :(得分:1)
尝试使用
if (factory.GetDerivedObject() is SomeDerivedType)
{
//do
}
或
var tmp = factory.GetDerivedObject() as SomeDerivedType;
if (tmp != null)
{
//do
}
答案 2 :(得分:1)
由于我发现您的GetDerivedObject()
不是通用的,并且您必须将其结果显式转换为SomeDerivedType
,因此我假设GetDerivedObject
被定义为返回基类型SomeDerivedType
(在极端情况下,object
)。
如果是这样,这一行:
typeof(SomeDerivedType).IsAssignableFrom(factory.GetDerivedObject().GetType());
转换为
typeof(SomeDerivedType).IsAssignableFrom(SomeBaseType);
通常是假的,因为你不能将基类型分配给派生类型(你需要明确地转换,这就是你所做的)。
答案 3 :(得分:0)
试试这个。它可能会奏效。它可能需要一些小的改动才能编译。
TypeBuilder b1 = moduleBuilder.DefineType(factory.GetDerivedObject().GetType().Name, TypeAttributes.Public, typeof(SomeDerivedType));
typeof(SomeDerivedType).IsAssignableFrom(b1))