C#Lambda表达式或代理作为属性或参数

JC *_*bbs 7 c# lambda

我正在寻找创建一个ValidationRule类来验证实体类型对象的属性.我真的想设置要检查的属性的名称,然后为该类提供一个委托或一个lambda表达式,当对象运行其IsValid()方法时将在运行时计算该表达式.有没有人有这样的事情片段,或任何关于如何将匿名方法作为参数或属性传递的想法?

另外,我不确定我是否在解释我想要完成的事情,所以如果我不清楚,请提出问题.

Dar*_*opp 6

实际上,您想要使用的是Func<T,bool>T是您要验证的项目的类型.然后你会做这样的事情

validator.AddValidation(item => (item.HasEnoughInformation() || item.IsEmpty());
Run Code Online (Sandbox Code Playgroud)

你可以将它们存储在一个List<Func<T,bool>>.


Fra*_*ger 3

class ValidationRule {
    public delegate bool Validator();

    private Validator _v;

    public ValidationRule(Validator v) { _v = v; }

    public Validator Validator {
        get { return _v; }
        set { _v = value; }
    }

    public bool IsValid { get { return _v(); } }
}

var alwaysPasses = new ValidationRule(() => true);
var alwaysFails = new ValidationRule(() => false);

var textBoxHasText = new ValidationRule(() => textBox1.Text.Length > 0);
Run Code Online (Sandbox Code Playgroud)

这应该可以帮助你开始。但实际上,继承在这里更合适。问题很简单,它Validator无法访问任何未关闭的状态,这意味着它不像ValidationRules包含自己的状态那样可重用。将以下类与之前的定义进行比较textBoxHasText

interface IValidationRule {
    bool IsValid { get; }
}

class BoxHasText : IValidationRule {
    TextBox _c;

    public BoxHasText(TextBox c) { _c = c; }

    public bool IsValid {
        get { return _c.Text.Length > 0; }
    }
}
Run Code Online (Sandbox Code Playgroud)