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



我有一个有2个构造函数的公共类:默认(没有参数),这是内部的,和一个不同的,这是公共的。默认构造函数用一些默认值调用另一个。

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

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

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

我知道有两种变通方法:

  1. 将构造函数设为public(但我不希望这个程序集的用户使用它)。
  2. 从一些公共方法调用构造函数(我有很多这样的类,所以我不想写很多这样丑陋无用的代码)。
对于这个问题有更好的解决方案吗?

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

谢谢,波阿斯

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

活化剂。CreateInstance有一个布尔重载,你可以指定是否要调用非公共构造函数。

public static Object CreateInstance(
    Type type,
    bool nonPublic
)

活化剂。CreateInstance(type, true)将调用public或privateinternalprotected的构造函数。

c#编译器不会为你删除任何构造函数。在Reflector中打开程序集,我相信你会看到你创建的构造函数。

我认为这是更有可能的反射代码,你用来找到构造函数不包括BindingFlags.NonPublic。显示如何工作的示例代码:

using System;
using System.Reflection;
class Foo
{
    internal Foo()
    {
        Console.WriteLine("Foo constructor");
    }
}
class Program
{
    static void Main(string[] args)
    {
        var ctor = typeof(Foo).GetConstructor
            (BindingFlags.NonPublic |
             BindingFlags.Public |
             BindingFlags.Instance,
             binder: null,
             types: new Type[0],
             modifiers: null);
        ctor.Invoke(null);
    }
}

编辑:传递绑定标志到Activator.CreateInstance,你需要使用不同的重载,像这样:

Activator.CreateInstance(typeof(Foo),                                 
                         BindingFlags.NonPublic |
                         BindingFlags.Public |
                         BindingFlags.Instance,
                         binder: null,
                         args: null,
                         culture: null);

(或者您可以使用注释中提到的CreateInstance(type, true))

相关内容

  • 没有找到相关文章

最新更新