使用Func <T,bool>验证对象

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)

Avn*_*tan 5

首先,流畅接口的关键是你的方法 - 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)