0

我有一个抽象的数据提供者,有很多方法。

在实现中,每个方法都需要做一些检查,然后再继续该方法的其余部分。这个检查总是一样的。

所以现在在每种方法中,我都这样做:

public override string Method1 {
    if(myCheck()) throw new Exception(...);
    ...Rest of my method1...
}
public override string Method2 {
    if(myCheck()) throw new Exception(...);
    ...Rest of my method2...
}
public override string Method3 {
    if(myCheck()) throw new Exception(...);
    ...Rest of my method3...
}

你明白了..

有没有更简单/更好/更短的方法来做到这一点?

4

2 回答 2

2

在 C# 中没有内置功能。不过,您可以在PostSharp中执行此操作。

public sealed class RequiresCheckAttribute : OnMethodBoundaryAspect
{
    public override void OnEntry(MethodExecutionEventArgs e)
    {
        // Do check here.
    }
}

如果您想在纯 C# 中执行此操作,可以让您的生活更轻松的一个小改进是将代码重构为一个单独的方法:

public void throwIfCheckFails() {
    if(myCheck()) throw new Exception(...);
}

public override string Method1 {
    throwIfCheckFails();
    // ...Rest of my method1...
}

这并不强制每个方法都执行检查 - 它只是让它更容易。

于 2012-07-31T10:24:29.410 回答
1

您可以通过以下方式实现基类:

public virtual string MethodCalledByMethod1 {
}

public virtual string MethodCalledByMethod2 {
}

public virtual string MethodCalledByMethod3 {
}

public string Method1 {
    if(myCheck()) throw new Exception(...);
    return MethodCalledByMethod1();
}
public string Method2 {
    if(myCheck()) throw new Exception(...);
    return MethodCalledByMethod2();
}
public string Method3 {
    if(myCheck()) throw new Exception(...);
    return MethodCalledByMethod3();
}

然后在你的孩子班

public override string MethodCalledByMethod1 {
    ...Rest of my method1...
}

public override string MethodCalledByMethod2 {
    ...Rest of my method1...
}

public override string MethodCalledByMethod3 {
    ...Rest of my method1...
}

基本上,您覆盖由基类实现调用的方法 1 到 3。基类实现包含 mycheck(),因此您只需担心编写一次(即在基类实现中)。

于 2012-07-31T10:50:03.427 回答