2012-04-10 70 views
10

我試圖做這樣的事情:如何拆箱一個C#對象動態類型

void someMethod(TypeA object) { ... } 

void someMethod(TypeB object) { ... } 

object getObject() 
{ 
    if (...) return new TypeA(); 
    else return new TypeB(); 
} 

object obj = getObject(); 
(obj.GetType()) obj; // won't compile 
someMethod(obj); 

很顯然,我很困惑在這裏。我知道我能僅通過寫了一個條件語句這項工作 -

if (obj.GetType() == typeof(TypeA)) obj = (TypeA)obj; 
else if (obj.GetType() == typeof(TypeB)) obj = (TypeB)obj; 

- 但不是有某種方式在運行時做到這一點?

編輯 我同意它似乎也許不是最好的設計選擇,所以這裏是上下文。上面代碼的要點是MongoDB的Repository基類。我希望它能夠處理不同種類的表格。所以,someMethod()實際上是刪除;並且TypeA和TypeB是ObjectIDGuid;底部的代碼是類型不可知的部分刪除方法,該方法接受ID作爲字符串; getObject()是解析ID參數的一種方法。

+0

你混爲一談與它相關聯的運行時類型信息的類型'T':'typeof運算( T)'。它們不是一回事,也不能相互替代。 – 2012-04-10 18:09:41

+0

可能會有更好的設計選擇,但是您將代碼的實際目標從您的帖子中刪除。也許我們可以爲您提供一種更好,完全不同的方式來編寫解決方案,如果您讓我們知道您試圖使用此代碼完成什麼。 – 2012-04-10 18:12:35

+0

@Kirk Woll,我知道不同之處,我只是想說明我正在嘗試做什麼。 – McGarnagle 2012-04-10 18:22:00

回答

20

如果你使用.NET 4.0和C#4,你可以使用dynamic此:

dynamic obj = GetObject(); 
SomeMethod(obj); 

否則,你將不得不使用反射來查找和調用正確的方法。過載分辨率(對於非dynamic類型)在編譯時執行。

(請注意,除非TypeATypeB的結構,你就不會拆箱反正...)

+0

或'obj.SomeMethod()'? – 2012-04-10 18:10:01

+0

@RobertHarvey:沒有給出問題的寫法,它在同一類型中選擇重載。 – 2012-04-10 18:13:58

+0

不錯!正是我在找什麼,謝謝。 – McGarnagle 2012-04-10 18:14:09