【问题标题】:Can I pass a generic into a non-generic function once I've checked its type?一旦我检查了它的类型,我可以将一个泛型传递给一个非泛型函数吗?
【发布时间】:2013-07-14 07:31:57
【问题描述】:

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

我该怎么做?

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

例子:

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,但我不认为这是完全相同的问题。

【问题讨论】:

  • 您的x is Enumerable 中的Enumerable 是什么?你的意思是接口IEnumerable还是接口IEnumerable&lt;&gt;,或者这是一些classSystem.Linq.Enumerable 类不可能,因为那是 static class
  • ...ab 是相同类型的集合T,但b 可能包含包含a 的集合?
  • EnumerableContainsEnumerable 是一种检查集合 b 是否包含集合 x 的方法(我将交换参数的顺序以便更明显)。

标签: c# generics


【解决方案1】:

您检查变量的 dynamic 类型这一事实并不会改变它的 static 类型,以及它用于检查调用的内容。

如果你想这样做,你需要一个演员表。您可以使用已检查的演员表一次性完成:

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

as 操作符检查是否可以进行转换:如果是,则返回转换后的对象;如果不是,它将返回null

【讨论】:

  • 很好的解决方案,但取决于Enumerable 是什么,TEnumerable 之间可能不允许转换。你认为它是一个界面吗?
  • 但我“不能声明静态类型 System.Linq.Enumerable 的变量”。是否可以将 ex 声明为泛型类型的 IEnumerable?
  • @Ollyver:但是如果是静态类型,那么x就不可能是那种类型!也许您正在混合具有相同名称的几种不同类型...
  • 这基本上是我的问题 - 你的例子是如何工作的?因为如果我使用那个确切的代码,我声明 ex 是静态类型,这是不可能的;如果我将 ex 声明为 IEnumerable,我将再次使用动态类型检查。
  • @Ollyver:现在我不明白这个问题......在你的 OP 中你说x is Enumerable 并且Enumerable 也不能是静态类型。如果您的代码可以编译,那么我的代码也应该编译。请记住,在 .NET 中有不止一种名为 Enumerable 的类型。
猜你喜欢
  • 2011-08-05
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2011-01-16
  • 1970-01-01
  • 2021-05-05
  • 2013-03-07
相关资源
最近更新 更多