5

我正在尝试检查对象是否可以使用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分配给(可转换为)PropertyTypeof someProperty。我怎样才能做到这一点?

4

4 回答 4

7

当你有

 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);

但这仅处理继承。

于 2012-04-06T09:52:36.040 回答
1

尝试使用

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

或者

var tmp = factory.GetDerivedObject() as SomeDerivedType;
if (tmp != null)
{
//do
}
于 2012-04-06T09:51:29.380 回答
1

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

如果是这样,这一行:

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

翻译成

typeof(SomeDerivedType).IsAssignableFrom(SomeBaseType);

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

于 2012-04-06T10:00:02.870 回答
0

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

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

typeof(SomeDerivedType).IsAssignableFrom(b1))
于 2012-04-06T10:02:53.807 回答