2013-03-04 86 views
0

我已經梳理了關於這個問題的現有問題/答案,但是沒有一個能夠以我理解的方式明確地說明我正在尋找什麼。這裏是我的代碼片段:如何動態創建泛型以便傳遞到泛型方法?

Type t = **?** 

_SecondRole.ProvisionRelationship<t>(_FirstRole); 

我相信我想在這裏使用反射,雖然我不完全瞭解。我該如何定義「t」才能使用?

感謝您的協助。

+0

我會說這是[如何使用反射來調用通用方法]重複(http://stackoverflow.com/questions/232535/how-to-use-reflection-to-call-generic-method/232621#232621),但它看起來像你的問題「什麼類型傳遞給[MethodInfo。 MakeGenericMethod](http://msdn.microsoft.com/en-us/library/system.reflection.methodinfo.makegenericmethod.aspx)...請澄清。 – 2013-03-04 05:19:41

+0

這是什麼'_FirstRole'?是一個't'由任何機會?有時候會有一些三cks在這裏,但它取決於**精確**的情況。 – 2013-03-04 07:02:42

回答

1

如果_FirstRole是未知t的實例,例如:

object _FirstRole = Activator.CreateInstance(t); 

,那麼你可以在這裏利用dynamic

dynamic _FirstRole = Activator.CreateInstance(t); // or whatever 
_SecondRole.ProvisionRelationship(_FirstRole); 

第二行現在是一個dynamic聲明,評估部分在運行時(但有一些聰明的高速緩存使用) - 這意味着它可以從實際類型執行通用類型推斷_FirstRole


如果是的情況下,然後以調用的唯一方法是經由GetMethodMakeGenericMethod和 - 這是笨拙和不巨大高效。在這種情況下,我強烈建議重構_SecondRole.ProvisionRelationship接受Type參數,而不僅僅是泛型;當然你也可以仍然提供了一個通用版本,以避免影響現有代碼:

void ProvisionRelationship(Type type, SomeType role) {...} 
void ProvisionRelationship<T>(SomeType role) { 
    ProvisionRelationship(typeof(T), role); 
} 

並調用爲:

_SecondRole.ProvisionRelationship(t, _FirstRole);