一旦我检查了它的类型,我可以将泛型传递给非泛型函数吗?

时间:2013-07-14 07:31:58

标签: c# generics

我有一个通用方法,它接受类型为T的Enumerables。如果T也是一个Enumerable,我需要将它传递给另一个函数。但是,由于该函数只接受Enumerables,而T是通用的,因此不会编译。 我在通过它之前检查T是可枚举的 - 但显然不能解决这个问题。

我该怎么做?

(显然我可以编写另一个只接受IEnumerable< IEnumerable< T>>的方法,并在相关的地方使用它,但这似乎不太优雅。)

示例:

public static bool EnumerablesAreEqual<T>(IEnumerable<T> a, IEnumerable<T> b)
{
    foreach (T x in a)
    {
        if (x is Enumerable && !EnumerableContainsEnumerable(x, b))
            return false;
        if (!b.Contains(x))
            return false;
    }
    ...
}

我看过this post,但我认为这不是同一个问题。

1 个答案:

答案 0 :(得分:5)

检查变量的动态类型的事实不会更改其静态类型,以及用于检查调用的内容。

如果你想这样做,你需要一个演员表。您可以使用经过检查的强制转换来一次性完成:

Enumerable ex = x as Enumerable;
if (ex != null && !EnumerableContainsEnumerable(ex, b))
    return false;

as运算符检查是否可以进行强制转换:如果是,它将返回已转换的对象;如果不是,它将返回null