Darin ответ правильный, но также стоит отметить, что если вы получаете экземпляр T
в качестве параметра, вы также можете использовать .GetType()
:
public void Test<T>(T target)
{
Console.WriteLine("The supplied type is {0}", target.GetType());
}
Просто другой подход (typeof
будет проверять аргумент типа , тогда как .GetType()
работает с экземпляром типа ).
Как отмечает Даниэль в комментариях, необходимо учитывать нюанс: typeof(T)
вернет тип аргумента типа, тогда как .GetType()
вернет точный тип объекта - который может наследовать от T
, и typeof(T).IsAssignableFrom(target.GetType())
может возвращать true - но конкретные конкретные типы могут отличаться.
Пример:
using System;
namespace ConsoleApplication2
{
class Program
{
static void Main(string[] args)
{
GenericClass<TypeX>.GenericMethod(new TypeX());
GenericClass<TypeX>.GenericMethod(new TypeY());
Console.ReadKey();
}
}
public class TypeX {}
public class TypeY : TypeX {}
public static class GenericClass<T>
{
public static void GenericMethod(T target)
{
Console.WriteLine("TypeOf T: " + typeof(T).FullName);
Console.WriteLine("Target Type: " + target.GetType().FullName);
Console.WriteLine("T IsAssignable From Target Type: " + typeof(T).IsAssignableFrom(target.GetType()));
}
}
}
Результирующий вывод:
Передача экземпляра TypeX в качестве параметра:
TypeOf T: ConsoleApplication2. TypeX
Тип цели: ConsoleApplication2. TypeX
T IsAssignable From Target Type: True
Передача экземпляра Введите Y в качестве параметра:
TypeOf T: ConsoleApplication2. TypeX
Тип цели: ConsoleApplication2. ТипY
T IsAssignable From Target Type: True