Ari*_*ian 0 c# linq validation lambda c#-4.0
我想写一个简单的验证方法,如FluentValidation
我写了这个简单的代码:
public static class ExtensionMethods<T> where T : class
{
public static bool Validate(Func<T, bool> expression)
{
//What I should write?????
}
}
Run Code Online (Sandbox Code Playgroud)
我不知道我应该在方法体中写什么以及如何使用它.
编辑1:
我想为所有对象编写这样的代码:
ExtensionMethods<MyObject>.Validate(o=>o.ID == 1).AddMessage(....
Run Code Online (Sandbox Code Playgroud)
首先,流畅接口的关键是你的方法 - Validate
在这种情况下 - 不返回bool,而是返回一个可以再次调用的对象.所以,让我们说这是T. 另外,你并没有真正使用扩展方法语法,你只是定义一个静态方法.在我们开始之前的最后一件事 - 在类定义中设置泛型参数T,但这对静态类来说不是正确的事情,因为它们永远不会使用任何特定的泛型参数进行实例化.您需要将其添加到方法签名,而不是类签名:
所以这是你的方法,这两个变化:
public static class ExtensionMethods
{
public static T Validate<T>(this T myObj, Func<T, bool> expression)
where T : class
{
}
}
Run Code Online (Sandbox Code Playgroud)
现在,你想在那里做什么,你只需要调用验证表达式.它是一个委托,所以你只需将它称为函数,将第一个参数MyObject
作为参数传递给它.如果它返回false,我假设整个语句将抛出异常:
public static T Validate(this T myObj, Func<T, bool> expression)
{
if (expression(myObj))
{
return myObj; // Return the object for further processing.
}
else
{
throw new OhNoValidationFailedException("aaaaaaaaahhh!");
}
}
Run Code Online (Sandbox Code Playgroud)
您现在可以像这样使用它:
MyObject myObject = new MyObject();
myObject.Validate(o => o.MyProperty == 7).Do().Something().Else();
Run Code Online (Sandbox Code Playgroud)