C# MethodBase.IsConstructor无法按静态构造函数的指定方式工作

C# MethodBase.IsConstructor无法按静态构造函数的指定方式工作,c#,.net,reflection,constructor,static-constructor,C#,.net,Reflection,Constructor,Static Constructor,只是一个简单的观察。不适用于静态构造函数,文档中也没有提到这一事实(引用:“true如果此方法是由ConstructorInfo对象表示的构造函数”) 样本: static class Program { static void Main() { ConstructorInfo ci = typeof(Test).GetConstructor( BindingFlags.NonPublic | BindingFlags.Static, null, new Type

只是一个简单的观察。不适用于
静态
构造函数,文档中也没有提到这一事实(引用:“true如果此方法是由
ConstructorInfo
对象表示的构造函数”)

样本:

static class Program
{
  static void Main()
  {
    ConstructorInfo ci = typeof(Test).GetConstructor(
        BindingFlags.NonPublic | BindingFlags.Static, null, new Type[] { }, null);
    Console.WriteLine(ci is ConstructorInfo); // silly; writes True
    Console.WriteLine(ci.IsConstructor);      // ??     writes False
  }
}

static class Test
{
  static Test()
  {
    Console.WriteLine("I am your static constructor");
  }
}
问题:为什么?Bug还是不完整的规范?

“静态构造函数”实际上只是C#术语。在.NET本身中,有一个类型初始值设定项(根据)。类型可以有一个类型初始值设定项,而无需在C#中声明静态构造函数-例如,对于静态变量初始化

在源C#中使用静态构造函数有两种效果:

  • 它从类型中删除标志,可能会更改计时
  • 它将代码添加到类型初始值设定项中
因此,虽然它由
构造函数info
表示,但我并不特别惊讶
IsConstructor
返回false,因为它不是CLR术语中的构造函数。它是一个由
ConstructorInfo
对象表示的非构造函数:)如果文档被改写为“如果此方法是实例构造函数”,并且
GetConstructor
没有返回它(在我看来,这是非常不一致的),那么肯定会更清楚

添加
GetConstructor
do状态的文档:

要使用此方法重载获取类初始值设定项(.cctor),必须指定
BindingFlags.Static | BindingFlags.NonPublic
。还可以使用
TypeInitializer
属性获取类初始值设定项


。。。所以他们没有把它叫做构造函数。

静态构造函数不是对象的构造函数。这是一个术语失败的问题。当时术语令人困惑。属性
TypeInitializer
的类型为
ConstructorInfo
,所以像我这样的人很可能会认为“类型初始值设定项”是“构造函数”。你能猜出
typeof(Test).TypeInitializer.MemberType
返回什么吗?它看起来像是
someMethod的替代品。IsConstructor
可能是
someMethod.MemberType==MemberTypes.Constructor
@JeppeStigNielsen:我同意,这确实令人困惑,而且它是由
GetConstructor
返回的事实真的没有帮助。不过,我相信这就是为什么它会这样。