0

我有以下三个课程:

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。

请帮助...提前谢谢,桑

4

3 回答 3

0

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

        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();
                }
            }
        }
于 2013-07-19T10:20:11.920 回答
0

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

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

于 2013-07-19T10:25:28.683 回答
0

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

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>以任何有用的方式处理您的问题。为此,您可能需要确定该类型是否具有索引器,然后确定该索引器返回的类型的属性。
于 2013-07-19T15:24:46.593 回答