BindingFlags.OptionalParameterBinding在不同的框架中改变行为。 .NET中的错误?

时间:2013-08-07 14:16:16

标签: c# reflection .net-3.5 .net-4.5 activator

我试图强制Activator.CreateInstance使用带默认参数的构造函数。

我发现了这个建议,在SO上重复了几次(第一条评论)http://connect.microsoft.com/VisualStudio/feedback/details/521722/system-activator-createinstance-throws-system-missingmethodexception-with-constructor-containing-an-optional-parameter

我想在Mono上运行它并且它不起作用,抛出MissingMethodException。在提交bug之前,我已经在.NET 4.5上做了一个实验:

class Program
{
    static void Main(string[] args)
    {
        new A();
        Activator.CreateInstance(typeof(A),
            BindingFlags.CreateInstance 
            | BindingFlags.Public 
            | BindingFlags.Instance
            | BindingFlags.OptionalParamBinding,
            null, new Object[] {Type.Missing}, null);
    }
}
class A
{
    public A()
    {
        Console.WriteLine("First");
    }
    public A(int i = 5)
    {
        Console.WriteLine("Second");
    }
}

当然,结果是可以预测的:

First
Second

然后我尝试删除Type.Missing参数以查看发生了什么,希望找到一种方法来调用具有不同数量的默认参数的构造函数。

我惊讶地发现没有任何改变!通过new Object[]{}我的期望:

First
First

想知道Type.Missing做了什么,并且,通过golly!,为什么在互联网的例子中提到它,我改变了框架。

在.NET 4.0上它是相同的,但在.NET 3.5上,结果是

First
First

这看起来很奇怪。这种行为有记录的原因吗?

使用可能的许多可选参数调用构造函数的正确方法是什么?

0 个答案:

没有答案