0

我想写一个简单的验证方法,比如FluentValidation

我写了这个简单的代码:

public static class ExtensionMethods<T> where T : class 
{
    public static bool Validate(Func<T, bool> expression)
    {
        //What I should write?????
    }
}

我不知道我应该在方法体中写什么以及如何使用它。


编辑 1

我想为所有对象编写这样的代码:

ExtensionMethods<MyObject>.Validate(o=>o.ID == 1).AddMessage(....
4

1 回答 1

5

首先,流畅接口的关键是你的方法——Validate在这种情况下——不返回布尔值,而是返回一个可以再次调用的对象。所以让我们说这里是T。此外,您并没有真正使用扩展方法语法,您只是定义了一个静态方法。在我们开始之前的最后一件事——你在你的类定义中设置了泛型参数 T,但这对于静态类来说是不正确的,因为它们永远不会用任何特定的泛型参数实例化。您需要将其添加到方法签名,而不是类签名:

因此,这是您进行这两项更改的方法:

public static class ExtensionMethods
{
    public static T Validate<T>(this T myObj, Func<T, bool> expression) 
         where T : class
    { 
    }
}

现在,你想在那里做什么,你只需调用验证表达式。它是一个委托,因此您只需将其作为函数调用,将第一个参数 your 传递给它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!");
    }
}

您现在可以像这样使用它:

MyObject myObject = new MyObject();
myObject.Validate(o => o.MyProperty == 7).Do().Something().Else();
于 2012-09-15T08:08:40.660 回答