首頁 >後端開發 >C++ >如何在 C# 中使用變數的型別作為泛型參數?

如何在 C# 中使用變數的型別作為泛型參數?

Linda Hamilton
Linda Hamilton原創
2025-01-17 20:47:10875瀏覽

How Can I Use a Variable's Type as a Generic Parameter in C#?

在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中文網其他相關文章!

陳述:
本文內容由網友自願投稿,版權歸原作者所有。本站不承擔相應的法律責任。如發現涉嫌抄襲或侵權的內容,請聯絡admin@php.cn