我有一个带有一些自定义属性的基类,这个类是许多其他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()运行,即使在派生类中重构了构造函数:
答案 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
}