2012-04-06 107 views
3

我想檢查一個對象是否可以使用IsAssignableFrom強制轉換爲某種類型。然而,我沒有得到預期的結果... 我在這裏錯過了什麼嗎?C#檢查對象是否可以投射到另一個對象失敗?

//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分配到(澆注到)somePropertyPropertyType。我怎樣才能做到這一點?

+1

你可以創建一個完整的程序來展現行爲嗎? – 2012-04-06 09:47:09

+1

@ LasseV.Karlsen正如你在我的(現在刪除的)答案中所指出的那樣IsAssignableFrom需要一個類型而不是一個實例。 (MSDN在那裏有點誤導)從上面的代碼將有趣的知道SomeDerivedType t = factory.GetDerivedObject()作爲SomeDerivedType;'是否有效。 – Steve 2012-04-06 09:56:42

回答

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但如果是澆注

的基礎是:

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

但這隻能處理繼承。

+1

但從邏輯上講,GetDerivedObject必須是'SomeDerivedType'或後代,這意味着你的代碼的'true'行會匹配他的最後一行,他說他返回false。 – 2012-04-06 09:54:02

+0

@ LasseV.Karlsen:好評,我可能會在這裏弄亂變量。我只是在一個小型控制檯應用程序上進行驗證。 – Ropstah 2012-04-06 09:55:34

+0

那麼,查看http://ideone.com/pRnD2,你會發現它*應該*按照你想要的方式工作,這導致我認爲你的確在這裏弄亂了你的變量:) – 2012-04-06 09:56:27

1

嘗試使用

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

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

因爲我看你的GetDerivedObject()是不是通用的,你必須明確地投其結果SomeDerivedType,我假設GetDerivedObject被定義爲返回的SomeDerivedType基本類型(在極端情況下,object)。

如果是這樣,這條線:

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

轉化爲

typeof(SomeDerivedType).IsAssignableFrom(SomeBaseType); 

這通常是假的,因爲你不能基本類型分配給派生類型(你需要顯式轉換,這是你做的)。

+0

在我的示例中,工廠方法返回派生類型。但是,在我更新的問題中,您可以看到該對象實際上已轉換爲基本類型。這會影響'IsAssignableFrom'方法嗎? – Ropstah 2012-04-06 10:10:02

0

試試這個。它可能工作。它可能需要一些小的修改來編譯。

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

typeof(SomeDerivedType).IsAssignableFrom(b1)) 
+0

感謝您的思考,但我認爲問題與其他事情有關,也許我使用反射? – Ropstah 2012-04-06 10:11:04

相關問題