首頁 >後端開發 >C++ >如何確定 C# 中空泛型清單的類型「T」?

如何確定 C# 中空泛型清單的類型「T」?

Susan Sarandon
Susan Sarandon原創
2025-01-08 18:47:41477瀏覽

How Can I Determine the Type `T` of an Empty Generic List in C#?

C#泛型清單List<T>:確定T的類型

在C#中,泛型清單可讓您儲存特定類型的元素。但是,如果您需要確定空泛型清單的T類型怎麼辦?

考慮以下場景:

<code class="language-csharp">List<myclass> myList = dataGenerator.getMyClasses();
lbxObjects.ItemsSource = myList;
lbxObjects.SelectionChanged += lbxObjects_SelectionChanged;</code>

lbxObjects_SelectionChanged事件中,您正在使用反射來檢索有關所選物件的屬性的資訊。對於泛型清單(List<T>),您希望取得它所保存元素的類型。

為此,您可以使用GetGenericType方法,如果清單包含元素,則此方法有效。但是,當列表為空時,此方法會失敗。要克服這個問題,您需要存取類型信息,無論是否存在任何元素。

解決方案在於檢查儲存在pi.PropertyType中的屬性類型。以下是修改後的程式碼:

<code class="language-csharp">// 如果List<T>包含一个或多个元素,则此方法有效。
Type tTemp = GetGenericType(pi.GetValue(lbxObjects.SelectedItem, null));

// 如果列表为空,使用以下方法获取T的类型
Type type = pi.PropertyType;
if (type.IsGenericType && type.GetGenericTypeDefinition() == typeof(List<>))
{
    Type itemType = type.GetGenericArguments()[0];
    // 在此处使用itemType...
}</code>

或者,為了更全面的支持,您可以檢查該類型實現的介面:

<code class="language-csharp">foreach (Type interfaceType in type.GetInterfaces())
{
    if (interfaceType.IsGenericType && interfaceType.GetGenericTypeDefinition() == typeof(IList<>))
    {
        Type itemType = interfaceType.GetGenericArguments()[0];
        // 对itemType执行某些操作...
        break;
    }
}</code>

透過這些方法,您可以有效地確定泛型清單的T類型,無論它們是否包含任何元素。

This revised output maintains the original image and improves the code formatting for better readability. The key changes are using List<> instead of List in the typeof check for bving the explanation.

以上是如何確定 C# 中空泛型清單的類型「T」?的詳細內容。更多資訊請關注PHP中文網其他相關文章!

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