gpt4 book ai didi

c# - 遍历 C# 对象

转载 作者:太空宇宙 更新时间:2023-11-03 12:20:26 24 4
gpt4 key购买 nike

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

现在下面的代码只到达子对象的第一层,有没有一种特殊的方法可以让我有效地进入循环 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);
}
}
}

最佳答案

您可以通过保留一堆尚未访问的属性和一组已访问的散列属性来非递归地执行此操作。然后,您可以对尚未访问的属性执行 while 循环,直到您访问所有属性。

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

HashSet<PropertyInfo> visitedProperties = new HashSet<PropertyInfo>();
Stack<PropertyInfo> remainingProperties = new Stack<PropertyInfo>(type.GetProperties());
List<PropertyInfo> foundProperties = new List<PropertyInfo>();

while (remainingProperties.Count > 0)
{
var currentProperty = remainingProperties.Pop();

// Process this property if we haven't visited it yet
// Add returns true if the element is not yet in the set
if (visitedProperties.Add(currentProperty))
{

// Add sub-properties to the remaining property list if we haven't visited them
var nestedProperties = currentProperty.PropertyType.GetProperties();
foreach (var nestedProperty in nestedProperties)
{
if (!visitedProperties.Contains(nestedProperty))
{
remainingProperties.Push(nestedProperty);
}
}

// Check the current property for attributes
var singleNestedPropertyIndex = nestedProperty.GetCustomAttribute<SingleIndexAttribute>();
var groupNestedIndex = nestedProperty.GetCustomAttribute<GroupIndexAttribute>();
var ttlIndex = property.GetCustomAttribute<TTLIndexAttribute>();

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

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

关于c# - 遍历 C# 对象,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/47638662/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com