我正在寻找创建一个ValidationRule类来验证实体类型对象的属性.我真的想设置要检查的属性的名称,然后为该类提供一个委托或一个lambda表达式,当对象运行其IsValid()方法时将在运行时计算该表达式.有没有人有这样的事情片段,或任何关于如何将匿名方法作为参数或属性传递的想法?
另外,我不确定我是否在解释我想要完成的事情,所以如果我不清楚,请提出问题.
实际上,您想要使用的是Func<T,bool>
T是您要验证的项目的类型.然后你会做这样的事情
validator.AddValidation(item => (item.HasEnoughInformation() || item.IsEmpty());
Run Code Online (Sandbox Code Playgroud)
你可以将它们存储在一个List<Func<T,bool>>
.
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)