在 funcs 中封装转换

public class MyObject{
    public DateTime? TestDate { get; set; }

    public Func<MyObject, bool> DateIsValid = myObject => myObject.TestDate.HasValue && myObject.TestDate > DateTime.Now;

    public void DoSomething(){
        //We can do this:
        if(this.TestDate.HasValue && this.TestDate > DateTime.Now){
            CallAnotherMethod();
        }

        //or this:
        if(DateIsValid(this)){
            CallAnotherMethod();
        }
    }
}

本着清晰编码的精神,将上面的检查和转换封装为 Func 可以使你的代码更易于阅读和理解。虽然上面的例子非常简单,但是如果有多个 DateTime 属性,每个属性都有自己不同的验证规则,我们想检查不同的组合?每个都具有已建立的返回逻辑的简单单行 Func 既可读也可降低代码的明显复杂性。考虑下面的 Func 调用,并想象有多少代码会使方法变得混乱:

public void CheckForIntegrity(){
    if(ShipDateIsValid(this) && TestResultsHaveBeenIssued(this) && !TestResultsFail(this)){
        SendPassingTestNotification();
    }
}