На этом шаге мы перечислим правила задания таких типов.
Итак, знакомство с обобщенными типами мы начнем с обобщенных методов.
Принципиальное отличие обобщенного метода от обычного состоит в том, что при описании обобщенного метода вместо ключевого слова, определяющего тип данных, используется обобщенный параметр типа: некоторый идентификатор, обозначающий тип данных. Этот идентификатор используется в описании метода для обозначения типа данных. При вызове метода вместо обобщенного параметра типа "подставляется" фактический идентификатор типа, который обычно определяется по типу аргумента (или аргументов), переданного методу.
При описании обобщенного метода идентификатор, используемый в качестве обобщенного параметра типа, указывается в угловых скобках после имени метода. Именно наличие угловых скобок (с идентификатором обобщенного параметра типа) после имени метода является признаком того, что метод - обобщенный. Шаблон описания статического обобщенного метода выглядит так:
static тип результата имя метода<параметр типа>(аргументы){ // Код метода }
Ситуацию можно описать и иначе: в обобщенном методе после имени метода в угловых скобках можно указать идентификатор, который в коде метода используется для обозначения типа данных. Причем под "кодом метода" подразумевается и описание аргументов, и идентификатор типа результата. Например, ниже приведено описание статического обобщенного метода с одним обобщенным параметром типа:
public static void show<T>(T arg){ Console.WriteLine(arg); }
Это очень простой метод. Он не возвращает результат, у него один аргумент (обобщенного типа), и все, что делает этот метод, - выводит в консоль значение своего аргумента. При вызове метода ему фактически можно передавать аргумент любого типа. Тип аргумента (и конкретное значение параметра T) определяется по команде, которой вызывается метод. Скажем, если для вызова метода использована команда show(123), то вместо параметра T будет подставлено значение Int32. Также при вызове обобщенного метода можно (а иногда это просто необходимо) явно указать, какое значение следует использовать в качестве обобщенного типа. Такое значение (идентификатор типа) указывается в команде вызова обобщенного метода в угловых скобках после имени метода (но перед круглыми скобками с аргументами метода). В этом смысле корректной является команда
show<int>(123); ,
Определить тип аргумента, фактически переданного методу, можно с помощью метода GetType(). Метод GetType() вызывается из объекта, тип которого нужно определить. Результатом является объект класса Type. Объект класса Type содержит информацию о типе исходного объекта (того объекта, из которого вызывался метод GetType()). У объекта класса Type есть свойство Name. Значение свойства Name - название типа (класс объекта, из которого вызывался метод GetType()).
Для определения значения обобщенного типа (то есть когда мы хотим выяснить, какое значение использовано для обобщенного параметра) можно воспользоваться инструкцией typeof, после которой (в круглых скобках) указывается идентификатор типа. Результатом является объект класса Type. Название типа можно определить с помощью свойства Name.
На следующем шаге мы продолжим изучение этого вопроса.