如何通过反射获取C#集合类型属性的成员信息?
反射获取集合属性内部成员的解决方案
你遇到的核心问题是:直接获取myClass2属性的类型时拿到的是List<MyClass2>,而你需要的是集合中元素MyClass2的属性信息。以下是具体修改步骤和代码示例:
关键思路
- 先获取
MyClass中myClass2属性的类型信息 - 识别该类型是否为泛型集合,提取其泛型参数(即
MyClass2类型) - 针对提取出的元素类型,获取它的属性成员
完整代码示例
using System; using System.Collections.Generic; using System.Reflection; internal class MyClass { string name { get; set; } List<MyClass2> myClass2 { get; set; } } internal class MyClass2 { string field1 { get; set; } string field2 { get; set; } int field3 { get; set; } long field4 { get; set; } } class Program { static void Main() { // 获取MyClass的类型信息 Type myClassType = typeof(MyClass); // 获取myClass2属性的PropertyInfo(注意指定绑定标志,因为属性是非公共的) PropertyInfo myClass2Property = myClassType.GetProperty("myClass2", BindingFlags.NonPublic | BindingFlags.Instance); if (myClass2Property != null) { // 获取属性的实际类型:List<MyClass2> Type propertyType = myClass2Property.PropertyType; // 判断是否为泛型集合且只有一个泛型参数 if (propertyType.IsGenericType && propertyType.GetGenericArguments().Length == 1) { // 提取泛型参数,即MyClass2的类型 Type elementType = propertyType.GetGenericArguments()[0]; // 获取MyClass2的所有非公共实例属性 PropertyInfo[] myClass2Properties = elementType.GetProperties(BindingFlags.NonPublic | BindingFlags.Instance); // 遍历输出属性信息 foreach (var prop in myClass2Properties) { Console.WriteLine($"属性名:{prop.Name},类型:{prop.PropertyType.Name},成员类型:{prop.MemberType}"); } } } } }
注意事项
- 由于你的类和属性都是
internal或默认私有访问级别,反射时必须指定BindingFlags.NonPublic | BindingFlags.Instance,否则无法定位到目标成员 - 该方法适用于所有泛型集合类型(如
ICollection<T>、IList<T>等),核心逻辑是提取泛型参数对应的元素类型
内容的提问来源于stack exchange,提问作者Alex Vergara
相关产品推荐
相关产品推荐

