我找不到任何通用类型的方法,但如果您需要为特定类型执行此操作,在某些情况下是可能的。
例如,我有以下代码来检查一个类型是否是一个集合,如果是,则获取元素类型:
private static bool IsCollectionType(CodeType type, out CodeType elementType)
{
// string implements IEnumerable<char>, but we don't want to treat it as a collection
if (type.FullName == "System.String")
{
elementType = null;
return false;
}
var enumerable = type.Bases.OfType<CodeInterface>().FirstOrDefault(i => i.FullName.StartsWith("System.Collections.Generic.IEnumerable<"));
var method = enumerable?.Members.OfType<CodeFunction>().FirstOrDefault(m => m.Name == "GetEnumerator");
var enumerator = method?.Type.CodeType;
var current = enumerator?.Members.OfType<CodeProperty>().FirstOrDefault(m => m.Name == "Current");
if (current != null)
{
elementType = current.Type.CodeType;
return true;
}
elementType = null;
return false;
}
如您所见,我不是直接查看泛型类型参数,而是查看IEnumerable<T>.GetEnumerator().Current
. 当然,这需要有关您正在使用的类型的特定知识。