在下面的方法中,有三个条件。我想用方法替换它们并传入条件。
此外,条件体几乎重复。是否可以创建仅在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 :(得分: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
(谓词),要设置的参数(第二个bool
和string
),并返回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;
}