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()が含まれているため、これを1回だけ記述する必要があります(つまり、基本クラスの実装で)。

于 2012-07-31T10:50:03.427 に答える