Как я могу получить тип параметра экземпляра генерика? - PullRequest
3 голосов
/ 12 января 2012

Я потрясен, я не нашел ничего в Интернете об этой проблеме, но, вероятно, я ищу неправильные слова.Вот что мне нужно сделать.

Предположим, у меня есть универсальный тип: List<string> работает ради простоты.Как получить тип параметра (в данном случае typeof(string))?

Имейте в виду, что мне нужно сделать это вне универсального класса (а не внутри метода класса, что я и видел в других вопросах SO).Суть в том, что у меня есть экземпляр универсального типа, мне нужно знать как его тип, так и тип параметра (в приведенном выше примере я хотел бы получить как typeof(List), так и typeof(string), а не что-то вроде typeof(List<string>)).Конечно, это должно быть сделано во время выполнения.

Спасибо всем, кто ответит.

Ответы [ 4 ]

7 голосов
/ 12 января 2012

Звучит так, как будто вы ищете Type.GetGenericArguments().Вы бы назвали это на Type рассматриваемого экземпляра.Он возвращает массив Type ( к огорчению Эрика Липперта ).

4 голосов
/ 12 января 2012
typeof(List<string>).GetGenericArguments()[0]
2 голосов
/ 12 января 2012
var myList = new List<String>();
var shouldBeString = myList.GetType().GetGenericArguments().FirstOrNull();
var shouldBeGenericList = myList.GetType().GetGenericTypeDefinition();

См. http://msdn.microsoft.com/en-us/library/system.type.getgenericarguments.aspx и http://msdn.microsoft.com/en-us/library/system.type.getgenerictypedefinition.aspx соответственно

1 голос
/ 12 января 2012

Почему вы не сделаете свою функцию общей?Это позволит компилятору разобраться за вас.

void your_func<T>(List<T> lst)
{
    Type list_type = typeof(List<T>);
    Type generic_list_type = typeof(List<>);
    Type generic_argument_type = typeof(T);
    // do what you need     
}

Вы можете вызвать его как обычно:

var lst = new List<string>(); 
// ...
obj.your_func(lst);

Другой вариант - использовать отражение, как описано в других ответах.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...