Archive for Декабрь 2014
Type с null в FullName
При попытке получить тип 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);