Отражающие конструкторы со значениями по умолчанию в C # 4.0 - PullRequest
5 голосов
/ 10 марта 2010

Я только начал использовать C # 4.0 (RC) и столкнулся с этой проблемой:

class Class1 { public Class1() { } }
class Class2 { public Class2(string param1) { } }
class Class3 { public Class3(string param1 = "default") { } }

Type[] types = new Type[] { typeof(Class1), typeof(Class2), typeof(Class3) };

// Problem starts here, main-method
for(int i = 0; i < types.Length; i++)
{
    ConstructorInfo ctr = provider.GetConstructor(Type.EmptyTypes);
    Console.WriteLine(ctr == null ? "null" : ctr.Name);
}

Обратите внимание, я никогда не пробовал этот фактический код, но я только что посмотрел на результаты выполнения GetConstructor с использованием отладки в VS2010

Это идеально подходит для двух первых классов (1 и 2), первый печатает фактическое имя объекта ConstructorInfo объекта без параметров конструктора Class1, второй печатает ноль. Однако проблема возникает с третьим, потому что на самом деле я не хочу знать, принимает ли он 0 параметров или нет, а может ли я создать экземпляр класса без каких-либо параметров. Как мне это сделать?

1 Ответ

2 голосов
/ 10 марта 2010

Я нашел способ сделать это. Это не красиво, но работает.

var ctrs = from c in provider.GetConstructors()
           where c.GetParameters().Where(p => !p.IsOptional).Count() == 0
           select c;
ConstructorInfo ctr = ctrs.FirstOrDefault();
...