Tengo la siguiente clase genérica:
class Foo<T> { //Constructor A public Foo(string str) { Console.Write("A"); } //Constructor B public Foo(T obj) { Console.Write("B"); } }
Quiero crear una instancia de esta clase con T como una string
, usando el constructor B.
Llamar a new Foo<string>("Hello")
usa el constructor A. ¿Cómo puedo llamar al constructor B (sin usar la reflexión)?
Es horrible, pero podrías usar un método genérico local:
public void RealMethod() { // This is where I want to be able to call new Foo<string>("Hello") Foo<string> foo = CreateFoo<string>("Hello"); CreateFoo<T>(T value) => new Foo(value); }
Puede agregar eso como un método de utilidad en cualquier lugar, eso sí:
public static class FooHelpers { public static Foo<T> CreateFoo<T>(T value) => new Foo(value); }
(Preferiría el método local porque parece que rara vez es un problema).
Dado que los dos constructores usan nombres diferentes para los argumentos, puede especificar el nombre del argumento para elegir el constructor a usar:
new Foo<string>(str: "Test"); // Uses constructor A new Foo<string>(obj: "Test"); // Uses constructor B