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

标签 c# reflection compiler-optimization internal

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

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

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

System.MissingMethodException
    Message=No parameterless constructor defined for this object.

我知道两种解决方法:
  • 将构造函数公开(但我不希望该程序集的用户使用它)。
  • 从一些公共(public)方法调用构造函数(我有很多这样的类,所以我不想写很多这种丑陋无用的代码)。

  • 这个问题有更好的解决方案吗?

    值得一提的是,如果默认构造函数是公共(public)的,我不会得到那个异常。

    谢谢,

    波阿斯。

    最佳答案

    构造函数没有被删除,可能在搜索你的构造函数时你应该指定标志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();
        }
    

    Activator.CreateInstance 有一个带有 bool 值的重载,您可以在其中指定是否要调用非公共(public)构造函数。
    public static Object CreateInstance(
        Type type,
        bool nonPublic
    )
    

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

    关于c# - 如何防止 C# 编译器删除内部构造函数,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/8019244/

    相关文章:

    java - 如何获取注解元素的默认值?

    java - 无法理解Java字符串文字是如何实现的

    c# - 读取目录子文件夹中的所有文件

    c# - List.Except 方法返回错误结果

    c# - 如何将 .exe 作为 .NET 程序集加载?

    C#自定义复制构造函数,复制事件

    c# - 如何用c#解开keyboard-hook开发一个击键修改软件

    C# 使用流

    assembly - 如果许多编程语言前端的编译器后端相同,那么不同语言的编译目标代码是否相同?

    c++ - 下面的代码会被优化为一个函数调用吗?