new DelegateTest<int>().InvokeDoSomething(1);
new DelegateTest<string>().InvokeDoSomething("Hello");
delegate void DoSomethingDelegate<T>(T val);
if (typeof(T) == typeof(int))
_doSomething = (DoSomethingDelegate<T>)(Delegate)(DoSomethingDelegate<int>)DoSomethingInt;
else if (typeof(T) == typeof(string))
_doSomething = (DoSomethingDelegate<T>)(Delegate)(DoSomethingDelegate<string>)DoSomethingString;
else throw new NotSupportedException();
DoSomethingDelegate<T> _doSomething;
public void InvokeDoSomething(T x) => _doSomething(x);
void DoSomethingInt(int val) => Console.WriteLine($"DoSomethingInt({val})");
void DoSomethingString(string val) => Console.WriteLine($"DoSomethingString({val})");