Ответ 1
Вы не можете сделать конструкторы универсальными, но вместо этого вы можете использовать общий статический метод:
public static Constructor CreateInstance<T>(int blah, IGenericType<T> instance)
а затем сделайте все, что вам нужно, после конструктора, если потребуется. Другой альтернативой в некоторых случаях может быть введение не общего интерфейса, который расширяет общий интерфейс.
EDIT: согласно комментариям...
Если вы хотите сохранить аргумент во вновь созданном объекте и хотите сделать это строго типизированным способом, то тип также должен быть общим.
В этот момент проблема с конструктором уходит, но вы можете сохранить статический универсальный метод в любом случае в не-generic-типе: поэтому вы можете использовать вывод типа:
public static class Foo
{
public static Foo<T> CreateInstance<T>(IGenericType<T> instance)
{
return new Foo<T>(instance);
}
}
public class Foo<T>
{
public Foo(IGenericType<T> instance)
{
// Whatever
}
}
...
IGenericType<string> x = new GenericType<string>();
Foo<string> noInference = new Foo<string>(x);
Foo<string> withInference = Foo.CreateInstance(x);