将通用扩展方法添加到IEnumerable等接口

时间:2011-06-21 09:32:05

标签: c# generics extension-methods

我一直在尝试让我的通用扩展方法正常工作,但他们只是拒绝,我无法弄清楚为什么This thread didn't help me, although it should.

当然我已经查到了如何,在我看到他们说它很简单的任何地方,它应该是这个语法:
(在某些地方我读到我需要在参数解除后添加“where T:[type]”,但我的VS2010只是说这是语法错误。)

using System.Collections.Generic;
using System.ComponentModel;

public static class TExtensions
{
    public static List<T> ToList(this IEnumerable<T> collection)
    {
        return new List<T>(collection);
    }

    public static BindingList<T> ToBindingList(this IEnumerable<T> collection)
    {
        return new BindingList<T>(collection.ToList());
    }
}

但是这不起作用,我得到了这个错误:

  

类型或命名空间名称'T'可以   找不到(你错过了使用   指令或程序集引用?)

如果我再替换

public static class TExtensions

通过

public static class TExtensions<T>

它给出了这个错误:

  

扩展方法必须在a中定义   非通用静态类

任何帮助将不胜感激,我真的被困在这里。

3 个答案:

答案 0 :(得分:14)

我认为你所缺少的是在T中使方法变得通用:

public static List<T> ToList<T>(this IEnumerable<T> collection)
{
    return new List<T>(collection);
}

public static BindingList<T> ToBindingList<T>(this IEnumerable<T> collection)
{
    return new BindingList<T>(collection.ToList());
}

请注意参数列表前面每个方法名称后面的<T>。这说明它是一个带有单一类型参数的通用方法T

答案 1 :(得分:1)

尝试:

public static class TExtensions
{
  public static List<T> ToList<T>(this IEnumerable<T> collection)
  {
      return new List<T>(collection);
  }

  public static BindingList<T> ToBindingList<T>(this IEnumerable<T> collection)
  {
      return new BindingList<T>(collection.ToList());
  }
}

答案 2 :(得分:0)

您实际上没有创建声明非常规方法的泛型方法,这些方法在不定义T的情况下返回List<T>。您需要更改如下:

public static class TExtensions
    {
        public static List<T> ToList<T>(this IEnumerable<T> collection)
        {
            return new List<T>(collection);
        }

        public static BindingList<T> ToBindingList<T>(this IEnumerable<T> collection)
        {
            return new BindingList<T>(collection.ToList());
        }
    }