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
修改后的代码
<code class="language-csharp">Type type = pi.PropertyType; if (type.IsGenericType && type.GetGenericTypeDefinition() == typeof(List<>)) { Type itemType = type.GetGenericArguments()[0]; // 这将给出类型 }</code>
处理非 List 接口
为了更普遍地支持实现 IList
<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 IList<>
example. The use of List<>
instead of List
in the generic type definition check is also more accurate.
以上是如何在 C# 中确定空泛型列表的类型参数?的详细内容。更多信息请关注PHP中文网其他相关文章!