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
返回的事实真的没有帮助。不过,我相信这就是为什么它会这样。