C#中的泛型,使用變量類型作為參數(shù)我有一個通用的方法bool DoesEntityExist<T>(Guid guid, ITransaction transaction) where T : IGloballyIdentifiable;如何以下列方式使用該方法:Type t = entity.GetType();DoesEntityExist<t>(entityGuid, transaction);我一直收到愚蠢的編譯錯誤:找不到類型或命名空間名稱't'(您是否缺少using指令或程序集引用?)DoesEntityExist<MyType>(entityGuid, transaction);完美的工作,但我不想使用if指令每次調(diào)用具有單獨類型名稱的方法。
3 回答

翻翻過去那場雪
TA貢獻2065條經(jīng)驗 獲得超14個贊
關(guān)于泛型的觀點是給出編譯時類型安全性 - 這意味著需要在編譯時知道類型。
您可以使用僅在執(zhí)行時已知的類型調(diào)用泛型方法,但您必須使用反射:
// For non-public methods, you'll need to specify binding flags tooMethodInfo method = GetType().GetMethod("DoesEntityExist") .MakeGenericMethod(new Type[] { t });method.Invoke(this, new object[] { entityGuid, transaction });
伊克。
您是否可以使您的調(diào)用方法變得通用,并將您的類型參數(shù)作為類型參數(shù)傳遞,將決策推高到堆棧的一級?
如果您可以向我們提供有關(guān)您正在做的事情的更多信息,那將有所幫助。有時您可能需要使用上面的反射,但是如果您選擇正確的點,那么您可以確保只需要執(zhí)行一次,并讓低于該點的所有內(nèi)容以正常方式使用type參數(shù)。

ABOUTYOU
TA貢獻1812條經(jīng)驗 獲得超5個贊
解決這個問題的一種方法是使用隱式轉(zhuǎn)換:
bool DoesEntityExist<T>(T entity, Guid guid, ITransaction transaction) where T : IGloballyIdentifiable;
這樣稱呼它:
DoesEntityExist(entity, entityGuid, transaction);
更進一步,您可以將其轉(zhuǎn)換為擴展方法(它需要在靜態(tài)類中聲明):
static bool DoesEntityExist<T>(this T entity, Guid guid, ITransaction transaction) where T : IGloballyIdentifiable;
這樣稱呼:
entity.DoesEntityExist(entityGuid, transaction);

慕標琳琳
TA貢獻1830條經(jīng)驗 獲得超9個贊
我不確定我是否正確理解您的問題,但您可以這樣編寫代碼:
bool DoesEntityExist<T>(T instance, ....)
您可以按以下方式調(diào)用該方法:
DoesEntityExist(myTypeInstance, ...)
這種方式您不需要顯式寫入類型,框架將自動從實例中超過類型。
- 3 回答
- 0 關(guān)注
- 2708 瀏覽
添加回答
舉報
0/150
提交
取消