如何防止C#编译器删除内部构造函数

bri*_*ner 1 c# reflection internal compiler-optimization

我有一个带有2个构造函数的公共类:默认(没有参数),它是内部的,而另一个是公共的.默认构造函数使用一些默认值调用另一个构造函数.

我使用反射调用内部构造函数,因此它不会在程序集中的任何位置静态使用(仅通过反射).

当我进行反射调用时,我得到:

System.MissingMethodException
    Message=No parameterless constructor defined for this object.
Run Code Online (Sandbox Code Playgroud)

我知道两个解决方法:

  1. 使构造函数公开(但我不希望此程序集的用户使用它).
  2. 从一些公共方法调用构造函数(我有很多像这样的类,所以我不想写很多这个丑陋无用的代码).

这个问题有什么更好的解决方案

值得一提的是,如果默认构造函数是public,我不会得到该异常.

谢谢,

波阿斯.

Sal*_*iti 7

不会删除构造函数,可能在搜索构造函数时应指定标志BindingFlag.NonPublic.

    class xxx
    {
        private xxx() :
            this(10)
        {
        }

        public xxx(int value)
        {
            Console.WriteLine(value);
        }
    }

    static void Main(string[] args)
    {
        Activator.CreateInstance(typeof(xxx), true);
        Console.ReadLine();
    }
Run Code Online (Sandbox Code Playgroud)

Activator.CreateInstance有一个带布尔值的重载,您可以在其中指定是否要调用非公共构造函数.

public static Object CreateInstance(
    Type type,
    bool nonPublic
)
Run Code Online (Sandbox Code Playgroud)

Activator.CreateInstance(type,true)将调用构造函数,如果它是public或private\internal\protected.