System.Reflection-如何获取子级别类型的PropertyInfo

本文关键字:类型 PropertyInfo 获取 Reflection- 何获取 System | 更新日期: 2023-09-27 18:23:58

我有三个类,如下所示:

public class TestA
{
    public string Str1 { get; set; }
    public string Str2 { get; set; }
    public List<TestB> LstTestBs { get; set; }
    public TestC ObjTestC { get; set; }
}
public class TestB
{
    public string Str3 { get; set; }
    public string Str4 { get; set; }
}
public class TestC
{
    public string Str5 { get; set; }
}

我试过:

var prop = typeof (TestA).GetProperties();

但是,它只提供TestA中四个成员的PropertyInfo。我需要获取TestA、TestB和TestC类中所有成员的PropertyInfo。

请帮忙。。。提前感谢,San

System.Reflection-如何获取子级别类型的PropertyInfo

如果将所有类放在同一个命名空间中,则可以通过枚举命名空间中的类来收集属性,而不是挖掘属性结构:

通过反射获取命名空间中的所有类型

感谢大家的帮助。我已经得到了答案。

        var prop = typeof (TestA).GetProperties();
        for (int i=0;i<prop.Count();i++)
        {
            var propertyInfo = prop[i];
            if (propertyInfo.PropertyType.Namespace != "System")
            {
                if (propertyInfo.PropertyType.IsGenericType &&
                    propertyInfo.PropertyType.GetGenericTypeDefinition() == typeof (List<>))
                {
                    Type itemType = propertyInfo.PropertyType.GetGenericArguments()[0]; 
                    var listObjectProperties = itemType.GetProperties();
                    prop = prop.Union(listObjectProperties).ToArray();
                }
                else
                {
                    var childProp = propertyInfo.PropertyType.GetProperties();
                    prop = prop.Union(childProp).ToArray();
                }
            }
        }

SLaks是对的。您应该递归地执行此操作。有关递归概念的更多信息,请参阅维基百科关于递归的文章。例如,在您的案例中,这是一般的想法:

public void AddPropertiesAndChildPropertiesToList(Type type, List<PropertyInfo> list)
{
    var properties = type.GetProperties();
    list.AddRange(properties);
    foreach (var property in properties)
    {
        // recursive methods are ones that call themselves, like this...
        AddPropertiesAndChildPropertiesToList(property.PropertyType, list);
    }
}

请注意,这个例子缺少以下几点:

  • 最重要的是,它不能防止无限递归。您可以通过使用Stack<Type> alreadyVisited参数跟踪您已经去过的地方来解决此问题。如果您发现有人要求您添加已经访问过的类型的属性列表,请在方法中只添加return,或者抛出异常
  • 正如我在你的另一个相关问题中提到的,为了你的目的,你真的需要跟踪房地产链,而不仅仅是房地产。alreadyVisited堆栈在这里也很有用
  • 它不会以任何有用的方式处理您的List<TestB>。为此,您可能需要弄清楚该类型是否有索引器,然后弄清楚该索引器返回的类型的属性