方法中的临时方法?

时间:2013-06-20 23:29:06

标签: c# c#-4.0 design-patterns delegates func

在下面的方法中,有三个条件。我想用方法替换它们并传入条件。

此外,条件体几乎重复。是否可以创建仅在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"
   };
 }

}

基本上,我想在方法中创建一个临时方法。

1 个答案:

答案 0 :(得分:4)

您可以使用Func表示法。 Funcs封装了委托方法。阅读Funcs here的文档。对于具有Func个通用参数的n,第一个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方法。阅读Actions here。您可以实例化一个新的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;
}