gpt4 book ai didi

c# - 如何以通用类型安全的方式验证层次结构中的类?

转载 作者:行者123 更新时间:2023-11-30 14:41:48 25 4
gpt4 key购买 nike

一开始我被一个看似非常简单的任务困住了。我有一个类层次结构,每个类都可以在其中定义自己的验证规则。定义验证规则应该尽可能简单。这几乎是所需要的:

class HierarchyBase
{

private List<Func<object, bool>> rules = new List<Func<object, bool>>();
public int fieldA = 0;

public HierarchyBase()
{
AddRule(x => ((HierarchyBase)x).fieldA % 2 == 0);
}

protected virtual void Operation()
{
fieldA++;
}

protected void AddRule(Func<object, bool> validCriterion)
{
rules.Add(validCriterion);
}

public void PerformOperation()
{
Operation();
Validate();
}

protected virtual void Operation()
{
fieldA++;
}

private void Validate()
{
IsValid = rules.All(x => x(this));
}

public bool IsValid
{
get;
private set;
}
}

还需要一件事——添加验证规则时的类型安全。否则每个子类将不得不做那些看起来很尴尬的类型转换。理想Func<T, bool>会工作,但有一大堆问题:我们不能继承我们的 HierarchyBase来自任何类型的 IValidatable<HierarchyBase>因为继承层次结构可以有 N 层深(是的,我也闻到了这种味道);储存任何混凝土 Func<HierarchyBaseInheritor, bool>rules并遍历它们。

您将如何在这里引入类型安全?

最佳答案

正确的方法是让层次结构中的每个类负责验证自身:

HierarchyBase:

class HierarchyBase
{
public int A { get; set; }

public bool Validate()
{
return this.OnValidate();
}

protected virtual bool OnValidate()
{
return (this.A % 2 == 0);
}
}

HierarchyBaseInheritorA:

class HierarchyBaseInheritorA : HierarchyBase
{
public int B { get; set; }

protected override bool OnValidate()
{
return base.OnValidate() &&
(this.A > 10) &&
(this.B != 0);
}
}

HierarchyBaseInheritorB:

class HierarchyBaseInheritorB : HierarchyBaseInheritorA
{
public int C { get; set; }

protected override bool OnValidate()
{
return base.OnValidate() &&
(this.A < 20) &&
(this.B > 0) &&
(this.C == 0);
}
}

用法:

var result = new HierarchyBaseInheritorB();
result.A = 12;
result.B = 42;
result.C = 0;
bool valid = result.Validate(); // == true

关于c# - 如何以通用类型安全的方式验证层次结构中的类?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/3790462/

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