Получение типа элемента подкласса List с помощью CecilC#

Место общения программистов C#
Anonymous
Получение типа элемента подкласса List с помощью Cecil

Сообщение Anonymous »

Я пишу код, который должен получить тип элемента из всех типов, прямо или косвенно реализуя ICollection. У меня есть следующий код:

Код: Выделить всё

var collectionInterfaceType = GetTypeHierarchy(type)
.SelectMany(t => t.Interfaces)
.Select(iface => iface.InterfaceType)
.OfType()
.FirstOrDefault(interfaceType =>
interfaceType.ElementType.FullName is "System.Collections.Generic.ICollection`1" or "System.Collections.Generic.IReadOnlyCollection`1");
if (collectionInterfaceType != null)
{
var itemType = collectionInterfaceType.GenericArguments[0];
// Do something with itemType
}

static IEnumerable GetTypeHierarchy(TypeDefinition type)
{
return GetAncestorTypesAndSelf().Reverse().Skip(1 /*Exclude System.Object*/);

IEnumerable GetAncestorTypesAndSelf()
{
var currentType = type;
while (currentType != null)
{
yield return currentType;
if (currentType.BaseType == null)
break;
currentType = currentType.BaseType.Resolve();
}
}
}
Согласно информации, которую я нашел в Интернете (например, этот ответ), itemType будет иметь конкретный тип элемента коллекции. Во многих случаях это работает правильно, но в следующем случае itemType — это просто T:

Код: Выделить всё

public class CustomCollection : List { }
Как получить конкретный тип элемента (т. е. System.String) в приведенном выше случае?

Подробнее здесь: https://stackoverflow.com/questions/798 ... with-cecil

Вернуться в «C#»