¿Es posible ver qué constructor era el genérico?Constructores genéricos y reflejo
internal class Foo<T>
{
public Foo(T value) {}
public Foo(string value) {}
}
var constructors = typeof(Foo<string>).GetConstructors();
La propiedad 'ContainsGenericParameters' me devuelve false para ambos constructores. ¿Hay alguna manera de descubrir que los constructores [0] son genéricos? Ambos tienen la misma firma, pero me gustaría llamar a la cadena "real".
EDIT:
Quiero invocar el tipo determinado usando
ilGen.Emit(OpCodes.Newobj, constructorInfo);
así que necesitamos trabajar con la versión encuadernada. Pero me gustaría invocar al "mejor" constructor. Ese debería ser el comportamiento estándar. Cuando llamo
new Foo<string>()
el constructor con la cadena de firmas (y no el que tiene la firma genérica) se llama. Lo mismo debería suceder con mi código.
Gracias por su respuesta - el problema aquí es que utiliza "Tipo t = typeof (Foo <>);" - ya no funcionará con "Tipo t = typeof (Foo);" –
tanascius
llame a GetGenericTypeDefinition() para obtenerlo en Foo <>, entonces los índices del constructor aún se asignan al mismo constructor. De modo que puede reflexionar sobre Foo <> .. ctor para encontrar el índice correcto y luego usar el Foo ..ctor correspondiente a su generador de IL. Por lo que puedo decir, pierdes todo el genérico cuando vas con Foo . –
GetGenericTypeDefinition() fue exactamente lo que me perdí. ¡Muchas gracias! – tanascius