获取从C#

时间:2016-12-20 03:00:06

标签: c# generics types

让我们说我的课程来自List<T>

public class StringList : List<String> {}
public class NameList : StringList {}

public class IntList : List<int> {}

现在我有一个泛型方法,它需要类型List<T>

public static Method<T>() { ... }

如何确定此方法中列表中包含的元素类型,即如何在派生类中获取泛型参数类型?

对于基类,我可以调用typeof(T>.GetGenericArguments(),但对于派生类,它返回零大小。

PS:在我的具体情况中,方法所期望的类型不完全是List<T>,而是IList

2 个答案:

答案 0 :(得分:3)

您可以编写如下方法:

public static void Method<T>(List<T> thing) (or IList<T>)
{
    //Here, `T` is the type of the elements in the list
}

如果您需要基于反射的检查:

public static void Method(Type myType) 
{
    var thing = myType.GetInterfaces()
        .Where(i => i.IsGenericType)
        .Where(i => i.GetGenericTypeDefinition() == typeof(IList<>))
        .FirstOrDefault()
        .GetGenericArguments()[0];
}

请注意,您需要在此处进行适当的健全性检查(而不是FirstOrDefault()和0索引)

答案 1 :(得分:2)

如果在编译时同时需要列表类型和列表的元素类型,则Method必须有两个通用定义,如下所示:

public static void Method<T, E>(T list) where T : List<E> 
{ 
    // example1
    // T is List<int> and E is int

    // example2
    // T is NameList and E is String
}

Method<List<int>, int>(new List<int>());   //example1
Method<NameList, string>(new NameList());  //example2