2013-07-18 16 views
2

如果問題有些不清楚,我很抱歉;我不完全確定如何說明這一點。動態設置調用的泛型方法的類型或結果?

我的問題是這樣的。我有兩個班,Manager<T>Result<T>。在Manager<T>之內,我有一整套檢索功能。通常情況下,我會打電話Manager<T>並設置其類型,像這樣:

Manager<SpecialDataType> mgr = new Manager<SpecialDataType>; 

這之後,我建立了我的結果類型,並與經理我的功能,其中1是所示的GetItem函數中的參數填充它。然後,我可以訪問我的物品中的東西:

Result<SpecialDataType> item = new Result<SpecialDataType>; 
item = mgr.GetItem(1); 
string x = item.Teaser; 

好的。所以現在,我試圖做的是設置<SpecificDataType>在運行時填寫。我想我已經得到了一半的解決方案,使用泛型類型,如下所示:

Type generalType= Type.GetType("SpecificDataType"); 
Type managerType= typeof(Manager<>).MakeGenericType(generalType); 
var managerInstance= Activator.CreateInstance(managerType); 
object[] args = {1}; 
MethodInfo getItemMethod = managerInstance.GetMethod("GetItem"); 

但是,這裏是我卡住的地方。我需要能夠訪問Result類的特定屬性。它們當然是通過我正在投入的數據類型來設置的。當我做一個Invoke,就像這樣:

var item = getItemMethod.Invoke(managerInstance, args); 

我沒有得到任何我的財產,我知道是item一部分。我想這很有道理,因爲我們不知道item是什麼。所以,我們試過這個:

Type dataType = typeof(SmartFormData<>).MakeGenericType(sfType); 
var item = Activator.CreateInstance(dataType); 
item = getItemMethod.Invoke(managerInstance, args); 

得到了同樣的結果。我似乎無法得到item.Teaser。我不是一個C#編碼本身(好像這不是已經從這個過於複雜的問題,我問),所以我不是非常熟悉反射和泛型類型。任何人都可以向我指出如何解決這個問題的正確方向,或者如何從不同的角度來解決這個問題?唯一需要注意的是我無法修改Manager<T>Result<T>的功能;我必須使用我在那裏得到的。

在此先感謝您提供的任何幫助。

+1

你必須使用反射來訪問的'item'成員爲好,或將其轉換爲預期的類型。 –

+0

啊,但是手頭的問題在於我無法投射到預期的類型,因爲我不知道那是從哪開始的。我所擁有的是''SpecificDataType''字符串。那麼反思就是了。 –

回答

0

暗隼正確地指出在他的評論中,你將不得不使用反射來獲取你的項目的成員。

或者,如果你是在.NET 4或以上,你可以使用關鍵字dynamic大大簡化事情:

Type generalType= Type.GetType("SpecificDataType"); 
Type managerType= typeof(Manager<>).MakeGenericType(generalType); 
dynamic managerInstance = Activator.CreateInstance(managerType); 
var item = managerInstance.GetItem(1); 
string x = item.Teaser; 
+0

編譯完成後,根本沒有返回任何信息。這可能是我結束的事情; 'dynamic'好像是這裏的正確解決方案,但它似乎不適合我想要做的事情。 –

+0

@MattDempster:什麼不工作/返回任何東西? –

+0

對不起。我無法將item.Teaser拖入字符串x中。它只是返回null,但我知道數據存在,如果我使用傳統數據類型進行所有調用,則可以訪問它。 –

0

您需要調用的結果轉換爲類型你期待

var item = (Result<SpecificDataType>)getItemMethod.Invoke(managerInstance, args);