迭代通过C#对象

时间:2017-12-04 17:21:17

标签: c#

我正在寻找一种最有效的方法来迭代对象中的属性并检查它是否有自定义装饰器。挑战在于我的对象中有其他对象,可能有这个自定义装饰器,SUB对象也可能有装饰对象。

现在,下面的代码只是到达第一层子对象有没有一种特殊的方式,我可以在循环内有效地进行N次?

List<PropertyInfo> allProperties = type.GetProperties().ToList();

Dictionary<string, List<string>> groupIndexes = new Dictionary<string, List<string>>();

foreach (var property in type.GetProperties())
{
    var nestedProperties = property.PropertyType.GetProperties();
    foreach (var nestedProperty in nestedProperties)
    {
        var singleNestedPropertyIndex = nestedProperty.GetCustomAttribute<SingleIndexAttribute>();
        var groupNestedIndex = nestedProperty.GetCustomAttribute<GroupIndexAttribute>();
        var ttlIndex = property.GetCustomAttribute<TTLIndexAttribute>();

        if (singleNestedPropertyIndex != null || groupNestedIndex != null || ttlIndex != null)
        {
            allProperties.Add(nestedProperty);
        }
    }
}

2 个答案:

答案 0 :(得分:1)

您可以通过保留一堆尚未访问的属性和已访问过的属性哈希值来非递归地执行此操作。然后,你可以对尚未访问的属性进行一段时间的循环,直到你完全击中它们。

例如(注意:代码未经过测试):

require

这将在O(N)时间内执行,其中N是整个树中属性和嵌套子属性的总数。

答案 1 :(得分:0)

您可以通过创建递归方法来执行它;

    public static void FindSpecialProperties(PropertyInfo property, List<PropertyInfo> allProperties, HashSet<PropertyInfo> recursivedProperties)
    {
        if (recursivedProperties.Contains(property))//Eliminate already recursived property
        {
            return;
        }
        recursivedProperties.Add(property);
        var properties = property.PropertyType.GetProperties();
        if (properties.Length == 0)
        {
            return;
        }
        foreach (var propertyInfo in properties)
        {
            var singleNestedPropertyIndex = propertyInfo.GetCustomAttribute<SingleIndexAttribute>();
            var groupNestedIndex = propertyInfo.GetCustomAttribute<GroupIndexAttribute>();
            var ttlIndex = property.GetCustomAttribute<TTLIndexAttribute>();

            if (singleNestedPropertyIndex != null || groupNestedIndex != null || ttlIndex != null)
            {
                allProperties.Add(propertyInfo);
            }
            allProperties.Add(propertyInfo);
            FindSpecialProperties(propertyInfo, allProperties, recursivedProperties);
        }
    }

用法

        var recursivedProperties = new HashSet<PropertyInfo>();
        var allProperties = type.GetProperties().ToList();
        foreach (var property in type.GetProperties())
        {
            FindSpecialProperties(property, allProperties, recursivedProperties);
        }