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"
   };
 }

}

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

4

1 回答 1

4

您可以Func为此使用符号。 Funcs封装委托方法。阅读Funcs 此处的文档。对于Func具有n泛型参数的 a,第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");
}

在这里,我们实例化 a Func,它接受 a bool(谓词)、要设置的参数(第二个bool和 the string),并返回 a ClassZ

这也使用了空值合并(??符号),它返回第一个非空参数。在此处阅读有关空值合并的更多信息。

另一种选择是使用Actions,它封装了void方法。Actions 在这里阅读。您可以实例化一个 new 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;
}
于 2013-06-21T01:02:52.180 回答