BindingFlags.OptionalParameterBinding различное поведение в разных структурах. Ошибка в.NET?
Я пытался заставить Activator.CreateInstance
использовать конструктор с параметрами по умолчанию.
Я нашел это предложение, повторенное несколько раз на SO (первый комментарий) http://connect.microsoft.com/VisualStudio/feedback/details/521722/system-activator-createinstance-throws-system-missingmethodexception-with-constructor-containing-an-optional-parameter
Я хотел запустить его на Моно, и это не сработало, бросая MissingMethodException
, Перед отправкой сообщения об ошибке я провел эксперимент на.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, и, черт возьми!, почему это упоминается в примерах через Интернет, я изменил структуру.
На.NET 4.0 было то же самое, НО на.NET 3.5 результат был
First
First
Это кажется очень странным. Есть ли документированные причины такого поведения?
Как правильно вызывать конструктор с возможно большим количеством необязательных параметров?