У меня есть следующий метод:
object Create(Type type)
{
var constructor = type.GetConstructor(typeof(int));
return constructor?.Invoke(new object[] {42});
}
Этот метод работает для большинства типов, либо находя конструктор и вызывая его, либо не возвращая ноль. Но, когда передается следующий тип, он выдает System.Reflection.AmbiguousMatchException
:
class C<T>
{
public C(int v) { Console.WriteLine("int"); }
public C(T v) { Console.WriteLine("T"); }
}
Create(typeof(C<int>));
Это ожидается, так как есть два конструктора с одинаковой сигнатурой, но вопрос в следующем: как вызвать специфику c конструктор (в данном случае тот, который будет печатать "int"
)? Если я использую GetConstructors()
и перечисляю их, я получаю два совершенно одинаковых конструктора. Похоже, что API ConstructorInfo
и ParameterInfo
не предоставляют никакой информации для различения guish их: оба являются не универсальными c методами, а типы параметров обоих являются Int32
.
Тот же вопрос относится и к методам, отличным от конструкторов, которые следуют той же схеме.