Общие типы с параметром типа в С#

Я не думаю, что это можно сделать на С#, но публиковать это просто, чтобы убедиться. Вот моя проблема. Я хотел бы сделать что-то вроде этого на С#:

var x = 10;
var l = new List<typeof(x)>();

или

var x = 10;
var t = typeof(x);
var l = new List<t>();

Но, конечно, это не сработает. Хотя это не должно быть проблемой, так как тип t разрешается во время компиляции. Я понимаю, что это можно решить с помощью отражения, но поскольку типы известны во время компиляции с использованием отражения, будет излишним.

Ответы

Ответ 1

public static List<T> CreateCompatibleList<T> (T t)
{
    return new List<T> () ;
}

var x = 10 ;
var l = CreateCompatibleList (x) ;

Ответ 2

Вы пытаетесь получить .Net, чтобы установить общий тип, используя оператор времени выполнения. Как вы знаете, это не сработает. Типы обобщений должны быть установлены во время компиляции.

Ответ 3

Определение дженериков выполняется так же, как в С#:

var someList = new List<int>();

Вы можете не определять такие файлы:

var x = 1;
var someType = typeof(x);
var someList = new List<someType>();

потому что в этом случае вы указываете тип во время выполнения, а не время компиляции. С# не поддерживает это.

Ответ 4

Вы не можете сделать это именно так, как вы просите, но с небольшим отражением вы можете сделать то же самое

Type genericType = typeof(List<>);
Type[] type = new Type[] { typeof(int) };
Type instanceType = genericType.MakeGenericType(type);
object instance = Activator.CreateInstance(instanceType );
var l = (List<int>)instance;