C#将转换封装在函数中

示例

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

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

    public void DoSomething(){
        //我们做得到:
        if(this.TestDate.HasValue &&this.TestDate> DateTime.Now){
            CallAnotherMethod();
        }

        //或这个:
        if(DateIsValid(this)){
            CallAnotherMethod();
        }
    }
}

本着干净代码的精神,像上面那样将检查和转换封装为Func可以使您的代码更易于阅读和理解。尽管上面的示例非常简单,但是如果存在多个DateTime属性,每个属性都有各自不同的验证规则,又想检查不同的组合怎么办?每个都建立了返回逻辑的简单的单行Funcs既可以读取,又可以减少代码的表观复杂性。考虑下面的Func调用,并想象将有更多代码使该方法混乱:

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