Общие типы с параметром типа в C # - PullRequest
14 голосов
/ 31 августа 2009

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

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

или

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

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

Ответы [ 4 ]

41 голосов
/ 31 августа 2009
public static List<T> CreateCompatibleList<T> (T t)
{
    return new List<T> () ;
}

var x = 10 ;
var l = CreateCompatibleList (x) ;
6 голосов
/ 31 августа 2009

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

3 голосов
/ 31 августа 2009

Определение дженериков в C # выполняется следующим образом:

var someList = new List<int>();

Вы можете не определять родовые формы следующим образом:

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

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

2 голосов
/ 31 августа 2009

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

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;
...