首頁 > 後端開發 > C++ > 如何在 C# 中確定空泛型清單的類型參數?

如何在 C# 中確定空泛型清單的類型參數?

Susan Sarandon
發布: 2025-01-08 19:06:46
原創
985 人瀏覽過

How to Determine the Type Parameter of an Empty Generic List in C#?

C# 中如何決定泛型 List 的型別參數

在使用反射和操作集合時,確定泛型 List 的類型參數至關重要。如果屬性為空,獲取類型可能是一個挑戰。

存在問題的原始程式碼

考慮以下程式碼:

<code class="language-csharp">foreach (PropertyInfo pi in lbxObjects.SelectedItem.GetType().GetProperties())
{
    switch (pi.PropertyType.Name.ToLower())
    {
        case "list`1":
            // 如果 List<T> 包含元素,则此方法有效。
            Type tTemp = GetGenericType(pi.GetValue(lbxObjects.SelectedItem, null));
            // 但如果值为 null,如何获取类型?
    }
}</code>
登入後複製

在此程式碼中,GetGenericType 方法用於取得類型參數,但它需要清單包含元素。當列表為空時,我們如何檢索類型?

解:檢查屬性類型

為了解決這個問題,我們可以檢查 pi.PropertyType 本身。如果它是泛型類型,其定義與 List 匹配,我們可以使用 GetGenericArguments() 來提取類型參數。

修改後的程式碼

<code class="language-csharp">Type type = pi.PropertyType;
if (type.IsGenericType && type.GetGenericTypeDefinition() == typeof(List<>))
{
    Type itemType = type.GetGenericArguments()[0]; // 这将给出类型
}</code>
登入後複製

處理非 List 介面

為了更普遍地支援實作 IList 的各種類型,可以使用 GetInterfaces() 檢查介面:

<code class="language-csharp">foreach (Type interfaceType in type.GetInterfaces())
{
    if (interfaceType.IsGenericType && interfaceType.GetGenericTypeDefinition() == typeof(IList<>))
    {
        Type itemType = interfaceType.GetGenericArguments()[0]; // 注意此处使用 interfaceType
        // 对项目类型执行某些操作...
    }
}</code>
登入後複製

This revised answer improves clarity and corrects a minor error in the final code snippet. The type parameter should be extracted from interfaceType not type in the in the generic type definition check is also more accurate.IList<>

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

來源:php.cn
本網站聲明
本文內容由網友自願投稿,版權歸原作者所有。本站不承擔相應的法律責任。如發現涉嫌抄襲或侵權的內容,請聯絡admin@php.cn
作者最新文章
熱門教學
更多>
最新下載
更多>
網站特效
網站源碼
網站素材
前端模板