我的类被实例化时需要运行受保护的方法

时间:2013-07-25 17:12:00

标签: c#

我有一个带有一些自定义属性的基类,这个类是许多其他clases的基类 这是我的班级:

[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()一直运行。

是Posible吗?

还有另一种方法吗?

注意:我需要保持 checkAttributes()运行,即使在派生类中重构了构造函数:

2 个答案:

答案 0 :(得分:5)

是的,只需定义一个调用此方法的构造函数:

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

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

只要Foo上的每个构造函数都调用checkAttributes()(直接或通过链接到构造函数),派生类将无法避免检查。

(目前还不清楚为什么这种方法会受到保护。考虑将其设为私有,因为它听起来像是在构造对象时进行的一次性检查,并且不需要稍后运行。)< / p>


Foo的一个构造函数必须Foo(直接或间接)派生​​的任何类型(直接或间接)调用。

来自C#5语言规范的第10.11.1节:

  

所有实例构造函数(类object除外)都隐式包含在构造函数体之前的另一个实例构造函数的调用。

     

...

     

如果实例构造函数没有构造函数初始值设定项,则隐式提供形式为base()的构造函数初始值设定项。

派生类型可以避免在Foo上调用构造函数的唯一方式是无限地递归到它自己的构造函数之一,这最终会导致{{1} }。

答案 1 :(得分:0)

如果要在对象的每个对象创建上运行它,则必须在普通构造函数中调用它。

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

但是,如果您希望它在您的应用程序生命周期中只运行一次,您可以调用静态构造函数Like

static Foo()
{
    // your static method that needs to be run only once
}