【问题标题】:Constraints on Generic Types in Methods in C#C# 方法中泛型类型的约束
【发布时间】:2010-12-24 02:31:35
【问题描述】:

我有一个方法要求输入类型<T>。它只要求此类型定义了 Count 属性。如何将其指定为允许所有定义了Count 的对象的类型约束?

这是我目前拥有的:

    private static void writeData<T>(String fileName, T rawData) where T : ICollection

但是,如果我尝试将它与 IDictionary 一起使用,这将不起作用。我还能尝试什么?

更新:我认为问题在于我将其限制为非通用ICollection,而不是通用ICollection&lt;E&gt;

【问题讨论】:

  • 定义this won't work。这应该可以正常工作。
  • 你是指 IDictionary 吗?由于 IDictionary impelements ICollection
  • 您正在寻找一种叫做“结构类型”的东西。请参阅stackoverflow.com/questions/2831175/…,它询问与 Scala 构造等效的 C#。我在网上找到的答案是(简而言之)“否”:(

标签: c# .net generics


【解决方案1】:

您的代码应该使用IDictionary,因为它实现了ICollection
请注意,它不适用于IDictionary&lt;TKey, TValue&gt;,因为它没有实现(非通用)ICollection
如果要接受泛型集合,可以改为

static void WriteData<TElement>(String fileName, ICollection<TElement> rawData)

顺便说一句,您实际上不需要在这里使用泛型;你可以只取ICollection 类型的参数,调用者可以传递任何派生类型。
要获取泛型集合,您需要为 元素 提供类型参数,但不需要为集合类型提供类型参数。

要回答您的其他问题,您不能通过属性的存在来限制参数,除非通过创建接口。
由于框架中没有ICountedEnumerable 接口,所以你不走运。 (除非您制作自己的接口并且只允许实现它的自定义集合)

【讨论】:

  • @Generic:他没有使用泛型。否则,他需要两个类型参数。
【解决方案2】:

我认为你不能在编译时这样做。

您可以使用反射来检查 T 是否有 Count 方法,然后调用它。

【讨论】:

    【解决方案3】:

    响应更新:那么不要通过字典。改为传递dictionaryVariable.Values

    【讨论】:

      【解决方案4】:

      您正在寻找名为structural typing 的东西。 (公认的解决方案虽然可能有效/适当,但不使用结构类型。)

      请参阅(SO 问题)Does C# have an equivalent to Scala's structural typing?

      尽管有一些duck-typing 方法是可能的,但简短的回答似乎是“否”。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2012-06-05
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多