在C#中使用變數型別作為泛型參數
C#中的泛型提供了編譯時型別安全,要求型別在編譯時已知。
假設你定義了一個泛型方法:
<code class="language-csharp">bool DoesEntityExist<T>(Guid guid, ITransaction transaction) where T : IGloballyIdentifiable;</code>
當你嘗試動態使用它時,會遇到編譯錯誤:
<code class="language-csharp">Type t = entity.GetType(); DoesEntityExist<t>(entityGuid, transaction);</code>
這是因為t
只在執行時已知,這違反了泛型的編譯時型別安全原則。
你可以使用反射來處理動態型別的泛型方法:
<code class="language-csharp">MethodInfo method = GetType().GetMethod("DoesEntityExist") .MakeGenericMethod(new Type[] { t }); method.Invoke(this, new object[] { entityGuid, transaction });</code>
然而,這種方法由於其複雜性和性能開銷而並非理想之選。
更好的解決方案是將你的呼叫方法設為泛型,並將型別參數作為型別參數傳遞:
<code class="language-csharp">void MyMethod<T>(T entity, Guid guid, ITransaction transaction) { DoesEntityExist<T>(guid, transaction); }</code>
這樣,你就可以在呼叫MyMethod
時動態指定類型,在保持型別安全的同時避免使用反射。
以上是如何在 C# 中使用變數的型別作為泛型參數?的詳細內容。更多資訊請關注PHP中文網其他相關文章!