C# 实例化类时需要运行受保护的方法

C# 实例化类时需要运行受保护的方法,c#,C#,我有一个带有一些自定义属性的基类,这个类是许多其他类的基类 这是我的班级: [CustomAttribute1("First")] [CustomAttribute2("Other")] public class Foo { protected void checkAttributes() { // Need to run this code when the class and derived classes are instantiated } }

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

[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()运行:

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

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

    protected void checkAttributes()
    {
        throw new NotImplementedException();
    }
}
只要
Foo
上的每个构造函数最终调用
checkAttributes()
(直接调用或链接到一个构造函数),派生类就无法避免检查

(不清楚为什么要保护这个方法。考虑将它私有化,因为它听起来像是在构建对象时一次性检查运行,而不需要在以后运行。)< /P>


Foo
的构造函数之一必须由派生自
Foo
的任何类型(直接或间接)调用(直接或间接)

根据C#5语言规范第10.11.1节:

所有实例构造函数(类
对象
的实例构造函数除外)都隐式地在构造函数体之前调用另一个实例构造函数

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


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

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

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

    protected void checkAttributes()
    {
        throw new NotImplementedException();
    }
}
只要
Foo
上的每个构造函数最终调用
checkAttributes()
(直接调用或链接到一个构造函数),派生类就无法避免检查

(不清楚为什么要保护这个方法。考虑将它私有化,因为它听起来像是在构建对象时一次性检查运行,而不需要在以后运行。)< /P>


Foo
的构造函数之一必须由派生自
Foo
的任何类型(直接或间接)调用(直接或间接)

根据C#5语言规范第10.11.1节:

所有实例构造函数(类
对象
的实例构造函数除外)都隐式地在构造函数体之前调用另一个实例构造函数

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


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

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

  public Foo()
  {
     //Your normal method call
  }
但是,如果希望它在应用程序生命周期内只运行一次,则可以调用静态构造函数,如

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

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

  public Foo()
  {
     //Your normal method call
  }
但是,如果希望它在应用程序生命周期内只运行一次,则可以调用静态构造函数,如

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

但如果在派生类中存在另一个构造函数,如Foo(int myvar),会发生什么情况?@JuanPabloGomez任何类型的构造函数都必须调用同一类型或父类型上的另一个构造函数(
System.Object
是唯一的例外)。如果省略链式构造函数调用,则使用父级no-arg构造函数。(如果父类型不包含无参数构造函数,并且派生类型的构造函数中未显式指定链接构造函数,则这是编译时错误。)这意味着空构造函数始终在我的类型和派生类型上运行?我的问题是在派生类上,它们可以实现它自己的构造函数。@JuanPabloGomez是的。我刚才回答了那个问题。每个构造函数必须在同一类型或父类型上调用另一个构造函数。从
Foo
派生的类型上的构造函数别无选择,只能调用
Foo
构造函数(直接或通过同一类型上的另一个构造函数)。如果你不相信我,那你自己就试着绕过这个限制。这意味着如果从未使用过Foo(),checkAttributes就永远不会发生?还有其他解决办法吗?对不起,我相信你,只是没有太多经验。我在这一点上停止了2天。但是如果在派生类中有另一个构造函数,比如Foo(int myvar),会发生什么呢?@JuanPabloGomez构造函数在任何类型上都必须调用另一个构造函数(
System.Object
是唯一的例外),无论是在同一类型上还是在父类型上。如果省略链式构造函数调用,则使用父级no-arg构造函数。(如果父类型不包含无参数构造函数,并且派生类型的构造函数中未显式指定链接构造函数,则这是编译时错误。)这意味着空构造函数始终在我的类型和派生类型上运行?我的问题是在派生类上,它们可以实现它自己的构造函数。@JuanPabloGomez是的。我刚才回答了那个问题。每个构造函数必须在同一类型或父类型上调用另一个构造函数。从
Foo
派生的类型上的构造函数别无选择,只能调用
Foo
构造函数(直接或通过同一类型上的另一个构造函数)。如果你不相信我,那么你自己就试着绕过这个限制。这意味着如果Foo()从未被使用过,那么checkAttributes就永远不会被使用