Alexey Suvorov dev blog

Мой разработческий блог

Archive for Декабрь 2014

Type с null в FullName

leave a comment »

При попытке получить тип generic аргумента метода в не generic классе или generic классе непараметризованного каким либо типом-параметром, FullName результата будет null. При этом GetHashCode и Equals не будут корректно работать по сравнению с типом который можно получить через typeof для open generic. Пример:

// то же для Generic<T>
public class NotGeneric
{
    public void GenericMethod<T>(IEnumerable<T> seq){}
}

var m = typeof(NotGeneric).GetMethod("GenericMethod")
var t = m.GetParameters()[0].ParameterType;
Assert.Null(t.FullName);

Также можно видеть следующие лично для меня неожиданные эффекты:

// то же для Generic<T>
public class NotGeneric
{
    public void GenericMethod<T>(IEnumerable<T> seq){}
}

var m = typeof(NotGeneric).GetMethod("GenericMethod")
var t = m.GetParameters()[0].ParameterType;

Assert.False(t == typeof(IEnumerable<>));
Assert.False(t.GetHashCode() == typeof(IEnumerable<>).GetHashCode());

На самом деле generic уже параметризован типом с пустым GUID. Знания данной детали в принципе достаточно чтобы отличить все типы перегрузок generic методов и вызвать корректный.

// то же для Generic<T>
public class NotGeneric
{
    public void GenericMethod<T>(IEnumerable<T> seq){}
}

var m = typeof(NotGeneric).GetMethod("GenericMethod")
var t = m.GetParameters()[0].ParameterType;

Assert.True(t.GetGenericArguments()[0].GUID == Guid.Empty);

Written by alexeysuvorov

15.12.2014 at 6:28 пп

Опубликовано в .net, C#