如果問題有些不清楚,我很抱歉;我不完全確定如何說明這一點。動態設置調用的泛型方法的類型或結果?
我的問題是這樣的。我有兩個班,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>
的功能;我必須使用我在那裏得到的。
在此先感謝您提供的任何幫助。
你必須使用反射來訪問的'item'成員爲好,或將其轉換爲預期的類型。 –
啊,但是手頭的問題在於我無法投射到預期的類型,因爲我不知道那是從哪開始的。我所擁有的是''SpecificDataType''字符串。那麼反思就是了。 –