C#中方法中泛型类型的约束

时间:2010-12-23 18:07:57

标签: c# .net generics

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

这就是我目前的情况:

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

但是,如果我尝试将其与IDictionary一起使用,则无效。我还能尝试什么?

更新:我认为问题在于我将其限制为非通用ICollection,而不是通用ICollection<E>

4 个答案:

答案 0 :(得分:2)

您的代码应与IDictionary一起使用,因为它实现了ICollection 请注意,它不适用于IDictionary<TKey, TValue>,因为它未实现(非泛型)ICollection。 如果要接受泛型集合,可以将其更改为

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

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

要回答您的其他问题,除了通过创建界面外,您不能通过属性的存在约束参数。
由于框架中没有ICountedEnumerable接口,因此您运气不佳。 (除非您创建自己的界面并且只允许实现它的自定义集合)

答案 1 :(得分:0)

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

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

答案 2 :(得分:0)

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

答案 3 :(得分:0)

您正在寻找名为structural typing的内容。 (已接受的解决方案,虽然可能有效/适当,但不使用结构类型。)

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

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