如何检查泛型方法的类型T是否为IEnumerable <>并循环它?

tra*_*nmq 6 c# generics

我想做这样的事情

void DoSomething<T>(T param)
{
    if param is IEnumerable<?>
    {
        loop param and do stuff
    }
}
Run Code Online (Sandbox Code Playgroud)

我不知道在问号的位置做什么.它有可能吗?

Fra*_*oto 7

你在寻找的是:

if (T is IEnumerable) { .. }
Run Code Online (Sandbox Code Playgroud)

但是如果你希望T可以一直是IEnumerable:

void DoSomething<T>(T param) where T : IEnumerable
{
    foreach (var t in param) { ... }
}
Run Code Online (Sandbox Code Playgroud)

或检查IEnumerable中值的类型:

public void DoSomething<T,U>(T val) where T : IEnumerable<U>
{
    foreach (U a in val)
    {
    }
}
Run Code Online (Sandbox Code Playgroud)

不必担心自己检查,编译器会为你做,这是一个有静态类型系统和编译器的好东西:)

  • 我意识到这是一篇旧帖子,但是(T 是 IEnumerable)不仅无法编译,而且不正确。(typeof(T) 是 IEnumerable) 编译,但仍然是错误的,因为 typeof(T) 最终是一个对象。正确的方法似乎是: typeof(IEnumerable).IsAssignableFrom(typeof(T)) (2认同)