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构造函数之一必须由派生自(直接或间接)的任何类型调用(直接Foo或间接)。

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

所有实例构造函数(除了那些用于 class的构造函数)在constructor-bodyobject之前隐式包含对另一个实例构造函数的调用。

...

如果实例构造函数没有构造函数初始化器,base()则隐式提供表单的构造器初始化器。

派生类型可以避免调用构造函数的唯一Foo方法是无限递归到它自己的构造函数之一,这最终会导致StackOverflowException.

于 2013-07-25T17:13:33.910 回答
0

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

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

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

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