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