0

いくつかのカスタム属性を持つ基本クラスがあります。このクラスは、他の多くのクラスの基本クラスです。これは私のクラスです。

[CustomAttribute1("First")]
[CustomAttribute2("Other")]
public class Foo
{
    protected void checkAttributes()
    {
        // Need to run this code when the class and derived classes are instantiated 
    }
}

次に、インスタンスを作成すると

Foo MyClass = new Foo();

または派生クラスを構築します。

[CustomAttribute1("FirstDerived")]
public CustClass : Foo
{
    public CustClass(int MyVar)
    {
        //Something here
    }
    public void OtherMethod()
    {
    }
}

CustClass MyClass = new CustClass(5);

メソッドcheckAttributes()を常に実行する必要があります。

それは可能ですか?

別のアプローチがありますか?

注:派生クラスでコンストラクターが再定義されている場合でも、checkAttributes()が実行されることを確認する必要があります。

4

2 に答える 2

5

はい、このメソッドを呼び出すコンストラクターを定義するだけです。

public class Foo
{
    public Foo()
    {
        checkAttributes();
    }

    protected void checkAttributes()
    {
        throw new NotImplementedException();
    }
}

上のすべてのコンストラクターが(直接またはFoo呼び出しを行うコンストラクターへのチェーンによって) 呼び出しを終了する限り、派生クラスはチェックを回避できません。checkAttributes()

(ただし、このメソッドが保護される理由は不明です。プライベートにすることを検討してください。オブジェクトの構築時に一度だけ実行されるチェックであり、後で実行する必要がないように思われるからです。)


Fooのコンストラクターの1 つは、(直接的または間接的に)から派生する任意の型によって (直接的または間接的に) 呼び出される必要Fooがあります。

C# 5 言語仕様のセクション 10.11.1 から:

すべてのインスタンス コンストラクター ( class のコンストラクターを除く) には、 constructor-bodyobjectの直前に別のインスタンス コンストラクターの呼び出しが暗黙的に含まれます。

...

インスタンス コンストラクターにコンストラクター初期化子がない場合、フォームのコンストラクター初期化子base()が暗黙的に提供されます。

派生型がコンストラクターの呼び出しを回避できる唯一Fooの方法は、独自のコンストラクターの 1 つに無限に再帰することであり、最終的にStackOverflowException.

于 2013-07-25T17:13:33.910 に答える
0

オブジェクトの各オブジェクト作成でそれを実行したい場合は、通常のコンストラクターで呼び出す必要があります。

  public Foo()
  {
     //Your normal method call
  }

ただし、アプリケーションの有効期間中に一度だけ実行したい場合は、静的コンストラクターを呼び出すことができます

static Foo()
{
    // your static method that needs to be run only once
}
于 2013-07-25T17:21:58.277 に答える