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

时间:2012-04-06 09:43:29

标签: c# inheritance reflection

我正在尝试使用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}}。我该怎么做?

4 个答案:

答案 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))