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中文网其他相关文章!