2013-06-20 45 views
2

在下面的方法中,有三個條件。我想用方法替換它們並傳入條件。方法內的臨時方法?

此外,有條件的身體幾乎重複。是否有可能創建一個只存在於MyMethod()中的方法?所以,下面的代碼減少了這樣的事情:

//減少代碼

public ClassZ MyMethod (Class1 class1Var, Class2 class2Var) 
{ 
return localMethod((class1Var.SomeBool && !class2Var.SomeBool), false, "This is string1"); 
return localMethod((class1Var.SomeBool && !class2Var.IsMatch(class2Var)), true); 
return localMethod((class1Var.SomeProperty.HasValue && !class2Var.SomeBool), false, "This is string2"); 

//...localMethod() defined here... 
} 

但在上面,只有一個應返回。

//原始代碼

public ClassZ MyMethod (Class1 class1Var, Class2 class2Var) 
{ 

if(class1Var.SomeBool && !class2Var.SomeBool) 
{ 
    return new ClassZ 
    { 
    Property1 = false, 
    String1 = "This is string1" 
    }; 
} 

if(class1Var.SomeBool && !class2Var.IsMatch(class2Var)) 
{ 
    return new ClassZ 
    { 
    Property1 = true, 
    }; 
} 
if(class1Var.SomeProperty.HasValue && !class2Var.SomeBool) 
{ 
    return new ClassZ 
    { 
    Property1 = false, 
    String1 = "This is string2" 
    }; 
} 

} 

基本上,我想創建一個方法中的臨時方法。

+0

不確定你想要什麼,但肯定你的本地方法可能只是一個私人方法? –

+0

它可以。我寧願將它放在MyMethod()內,因爲它不需要在外部存在。 – 4thSpace

+0

我不認爲這是可能的,如果你真的關心無意調用該方法,可以使整個事情變成嵌套類,但實際上你有什麼顧慮?如果它是私有的,它甚至不能被派生類調用,因此提供它被明確記錄爲不可用,這是什麼問題? –

回答

4

可以使用Func符號來表示這一點。 Funcs封裝委託方法。閱讀Funcshere的文檔。對於Funcn通用參數,第一n-1是該方法的輸入和最後一個參數是返回類型。嘗試是這樣的:

public ClassZ MyMethod (Class1 class1Var, Class2 class2Var) 
{ 
    Func<bool, bool, string, ClassZ> myFunc 
      = (predicate, prop1Value, string1Value) => 
         predicate 
         ? new ClassZ { Property1 = prop1Value, String1 = string1Value } 
         : null; 
    return myFunc((class1Var.SomeBool && !class2Var.SomeBool), false, "This is string1") 
      ?? myFunc((class1Var.SomeBool && !class2Var.IsMatch(class2Var)), true) 
      ?? myFunc((class1Var.SomeProperty.HasValue && !class2Var.SomeBool), false, "This is string2"); 
} 

在這裏,我們實例化一個Func這需要在bool(謂語),參數設置(第二boolstring),並返回一個ClassZ

這也使用空合併(在??符號),它返回第一個非空參數。閱讀更多關於空合併here

另一種選擇是使用Actions,其封裝void方法。閱讀關於Actionshere。你可以實例化一個新的ClassZ,然後調用3 Actions,它有條件地設置提供的變量。

public ClassZ MyMethod (Class1 class1Var, Class2 class2Var) 
{ 
    Action<bool, bool, string, ClassZ> myAction 
     = (predicate, prop1Value, string1Value, classZInstance) => 
        if (predicate) 
        { 
         classZIntance.Property1 = prop1Value; 
         classZInstance.String1 = string1Value; 
        } 
    var myClassZ = new ClassZ(); 
    myAction((class1Var.SomeBool && !class2Var.SomeBool), false, "This is string1", myClassZ) 
    myAction((class1Var.SomeBool && !class2Var.IsMatch(class2Var)), true, classZ) 
    myAction((class1Var.SomeProperty.HasValue && !class2Var.SomeBool), false, "This is string2", myClassZ); 
    return myClassZ; 
}