首页 > 后端开发 > C++ > 如何确定 C# 中空泛型列表的类型'T”?

如何确定 C# 中空泛型列表的类型'T”?

Susan Sarandon
发布: 2025-01-08 18:47:41
原创
465 人浏览过

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 better type matching and improving the overall flow and clarity of the explanation.

以上是如何确定 C# 中空泛型列表的类型'T”?的详细内容。更多信息请关注PHP中文网其他相关文章!

来源:php.cn
本站声明
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系admin@php.cn
作者最新文章
热门教程
更多>
最新下载
更多>
网站特效
网站源码
网站素材
前端模板