C# 如何根据一组规则/函数进行验证

C# 如何根据一组规则/函数进行验证,c#,validation,delegates,func,C#,Validation,Delegates,Func,如何最好地通过一组规则验证对象,每个规则都必须返回一个ID和一个结果类型 我想要一个类似于Func的集合,我可以将对象发送到其中,同时从每个Func中获得单独的结果。有一些最佳实践吗?你的问题有点宽泛,但我很快就总结了一些东西,让你有个想法: public class ObjectValidator<T> where T : class { private List<Expression<Func<T, bool>>> m_rules =

如何最好地通过一组规则验证对象,每个规则都必须返回一个ID和一个结果类型


我想要一个类似于Func的集合,我可以将对象发送到其中,同时从每个Func中获得单独的结果。有一些最佳实践吗?

你的问题有点宽泛,但我很快就总结了一些东西,让你有个想法:

public class ObjectValidator<T> where T : class 
{
    private List<Expression<Func<T, bool>>> m_rules = new List<Expression<Func<T, bool>>>();
    private List<ValidationResult> m_results = new List<ValidationResult>();

    public ObjectValidator<T> AddRule(Expression<Func<T, bool>> rule)
    {
        // Null check, blah blah
        m_rules.Add(rule);
        return this; // Allows for chaining multiple rules together.
    }

    public List<ValidationResult> Validate(T objectInstance)
    {
        foreach (var rule in m_rules)
        {
            var isValid = rule.Compile()(objectInstance);

            var fieldExpression = rule.Body as BinaryExpression;
            var fieldNameExpression = fieldExpression.Left as MemberExpression;
            string fieldName = fieldNameExpression != null ? fieldNameExpression.Member.Name : "Object";

            var result = new ValidationResult(isValid, fieldName);
            m_results.Add(result);
        }

        return m_results;
    }
}
最后要使用它,假设我们有一个名为
Test
的对象,我们想验证它,它如下所示:

public class Test
{
    public int Property1 { get; set; }

    public string Property2 { get; set; }
}
Test instance = new Test { Property1 = 5, Property2 = "Bar" };

ObjectValidator<Test> validator = new ObjectValidator<Test>();
var results = validator.AddRule(x => x.Property1 < 10)
    .AddRule(x => x.Property2 == "Foo")
    .Validate(instance);
然后,您可以像这样使用验证器:

public class Test
{
    public int Property1 { get; set; }

    public string Property2 { get; set; }
}
Test instance = new Test { Property1 = 5, Property2 = "Bar" };

ObjectValidator<Test> validator = new ObjectValidator<Test>();
var results = validator.AddRule(x => x.Property1 < 10)
    .AddRule(x => x.Property2 == "Foo")
    .Validate(instance);
testinstance=newtest{Property1=5,Property2=“Bar”};
ObjectValidator validator=新的ObjectValidator();
var results=validator.AddRule(x=>x.Property1<10)
.AddRule(x=>x.Property2==“Foo”)
.验证(实例);

运行它以查看它的外观:)您显然需要进行更改以满足您的需求,但这是让您开始的事情

听起来你想要一个测试班。不是真的。我不需要测试自己的功能,而是在运行时测试数据。