I have the following generic class:
class Foo<T>
{
//Constructor A
public Foo(string str)
{
Console.Write("A");
}
//Constructor B
public Foo(T obj)
{
Console.Write("B");
}
}
I want to create an instance of this class with T being a string
, using constructor B.
Calling new Foo<string>("Hello")
uses constructor A. How can I call constructor B (without using reflection)?
It's horrible, but you could use a local generic method:
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);
}
You could add that as a utility method anywhere, mind you:
public static class FooHelpers
{
public static Foo<T> CreateFoo<T>(T value) => new Foo(value);
}
(I'd prefer the local method because this feels like it's rarely an issue.)
Since the two constructors use different names for the arguments, you can specify the name of the argument to choose the constructor to use:
new Foo<string>(str: "Test"); // Uses constructor A
new Foo<string>(obj: "Test"); // Uses constructor B