Вы не можете сделать конструкторы общими, но вместо этого вы можете использовать универсальный статический метод:
public static Constructor CreateInstance<T>(int blah, IGenericType<T> instance)
и затем делайте все, что вам нужно после конструктора, если требуется. Другой альтернативой в некоторых случаях может быть введение неуниверсального интерфейса, который расширяет универсальный интерфейс.
РЕДАКТИРОВАТЬ: Согласно комментариям ...
Если вы хотите сохранить аргумент во вновь созданном объекте, и вы хотите сделать это строго типизированным способом, то тип также должен быть универсальным.
В этот момент проблема конструктора исчезнет, но вы можете в любом случае захотеть сохранить статический универсальный метод в неуниверсальном типе, поэтому вы можете воспользоваться преимуществами вывода типа:
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);