我们可以使用PostSharp访问方法变量吗?

时间:2015-03-18 04:11:56

标签: c# postsharp aop

我有很多方法正在进行完全相同的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不起作用。我考虑为此创建ActionFunc,但方法(SomeMethodSomeMethod2OtherMethodOtherMethod2)签名是不同的。对于每种可能的方法签名都有一大堆它们似乎并不可持续。

有没有一种简单的方法来抽象出来?

2 个答案:

答案 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);
        }       
    }

}