我有很多方法正在进行完全相同的if
检查。是否有可能以某种方式包装这些方法,所以我不必重复检查?
例如,我有很多这样的方法:
public void Method1(int i)
{
if (isThisTrue())
{
SomeMethod(i, 2, 3); // returns void
}
else
{
SomeMethod2(i, "TestString"); // returns void
}
}
public string Method2()
{
if (isThisTrue())
{
return OtherMethod(1, true);
}
else
{
return OtherMethod2(1, "RandomString", 2);
}
}
由于if
其他else
子句的正文不同,simple cache aspect不起作用。我考虑为此创建Action
或Func
,但方法(SomeMethod
,SomeMethod2
,OtherMethod
和OtherMethod2
)签名是不同的。对于每种可能的方法签名都有一大堆它们似乎并不可持续。
有没有一种简单的方法来抽象出来?
答案 0 :(得分:0)
你想在某些情况下返回void这一事实使得它有点尴尬,因为void不适用于泛型。你可以这样做:
public void Method1(int i)
{
this.PredicateMethod(
NullFunc(() => SomeMethod(i, 1, 2)),
NullFunc(() => SomeMethod2(1, "RandomString")));
}
public string Method2()
{
return this.PredicateMethod(
() => OtherMethod(1, true),
() => OtherMethod2(1, "RandomString", 2));
}
private Func<object> NullFunc(Action a)
{
return new Func<object>(() =>
{
a();
return null;
});
}
private T PredicateMethod<T>(Func<T> trueMethod, Func<T> falseMethod)
{
return IsThisTrue() ? trueMethod() : falseMethod();
}
或者实现一个基类来捕获逻辑:
public abstract class PredicateBase
{
private readonly Func<bool> _predicate;
protected PredicateBase(Func<bool> predicate)
{
_predicate = predicate;
}
protected T PredicateMethod<T>(Func<T> trueMethod, Func<T> falseMethod)
{
return _predicate() ? trueMethod() : falseMethod();
}
protected void PredicateMethod(Action trueMethod, Action falseMethod)
{
if (_predicate())
trueMethod();
else
falseMethod();
}
}
答案 1 :(得分:-2)
你可以使用可选参数比意大利面条代码好得多!
public object Method(int i = -999)
{
if(i != -999){//Method #1
if (isThisTrue())
{
SomeMethod(i, 2, 3); // returns void
}
else
{
SomeMethod2(i, "TestString"); // returns void
}
}else{//Method #2
if (isThisTrue())
{
return OtherMethod(1, true);
}
else
{
return OtherMethod2(1, "RandomString", 2);
}
}
}