在C#泛型方法中使用變數型別作為參數
C#中的泛型提供了一種創建靈活的方法和類別的方式,這些方法和類別可以在不同的資料類型上運行,而無需為每種類型單獨實現。但是,在泛型方法中使用變數的類型作為參數可能具有挑戰性,尤其是在編譯時未知類型的情況下。
考慮以下泛型方法:
<code class="language-csharp">bool DoesEntityExist<T>(Guid guid, ITransaction transaction) where T : IGloballyIdentifiable;</code>
此方法根據其GUID和事務檢查實體是否存在。要使用此方法,需要在編譯時知道實體的類型。這通常透過在呼叫方法時明確指定類型參數來完成,如下所示:
<code class="language-csharp">DoesEntityExist<MyType>(entityGuid, transaction);</code>
但是,如果實體的類型僅在運行時已知,則我們無法使用上述方法。嘗試使用Type類型的變數呼叫該方法會導致編譯器錯誤:
<code>找不到类型或命名空间名称“T”(是否缺少 using 指令或程序集引用?)</code>
為了解決這個問題,我們可以使用反射來使用所需的型別參數來呼叫泛型方法。以下是我們可以執行此操作的方法:
<code class="language-csharp">Type t = entity.GetType(); MethodInfo method = GetType().GetMethod("DoesEntityExist") .MakeGenericMethod(new Type[] { t }); method.Invoke(this, new object[] { entityGuid, transaction });</code>
但是,這種方法效率較低,並且可能難以維護。因此,通常建議以這樣一種方式定義泛型方法:類型參數作為參數傳遞。這允許我們在運行時仍然使用所需的動態類型推斷的同時保持編譯時類型安全。
以上是如何在 C# 泛型方法中使用變數的型別作為參數?的詳細內容。更多資訊請關注PHP中文網其他相關文章!