gpt4 book ai didi

C# 遍历对象层次结构以执行方法

转载 作者:行者123 更新时间:2023-11-30 18:47:39 25 4
gpt4 key购买 nike

我有一个 Case 对象,它本身包含许多对象(见下文),又包含对象。

这些对象可以继承自 BaseDto 类,该类实现了 ValidateObject 方法,对当前对象执行 DataAnnotation 验证器,从而返回验证错误,累积到 ValidationResult 集合中。

我想将以下杂乱的语法转换为可以遍历给定对象的对象层次结构的内容,并为实现 ValidateObject 的每个对象(及其子对象!)执行它。

我现在感觉有点卡住了,所以如果有任何想法,我将不胜感激。

cCase.ValidateObject() &
cCase.Object1.ValidateObject() &
cCase.Object2.ValidateObject() &
cCase.Object3.ValidateObject() &
cCase.Object3.ChildObject1.ValidateObject() &
cCase.Object3.ChildObject2.ValidateObject() &
cCase.Object3.ChildObject3.ValidateObject() &
cCase.Object3.ChildObject4.ValidateObject() &
cCase.Object3.ChildObject4.ChildChildObject1.ValidateObject() &
cCase.Object3.ChildObject5.ValidateObject() &
cCase.Object4.ValidateObject() &
cCase.Object4.ChildObject6.ValidateObject();

最佳答案

我会使用这样的扩展方法:

public interface IValidatable
{
bool ValidateObject();
}

public static class ValidateExtensions
{
public static bool ValidateAll(this IValidatable item)
{
if (!item.ValidateObject())
return false;

const BindingFlags flags = BindingFlags.GetProperty | BindingFlags.Instance | BindingFlags.Public;
var type = item.GetType();
var props = type.GetProperties(flags).Select(x => x.GetValue(item));
var fields = type.GetFields(flags).Select(x => x.GetValue(item));
return props
.Concat(fields)
.OfType<IValidatable>()
.Select(x => x.ValidateAll())
.All(x => x);
}
}

关于C# 遍历对象层次结构以执行方法,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/13842152/

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