2011-06-21 53 views
6

我一直在努力,並試圖使我的通用擴展方法的工作,但他們只是拒絕,我不知道爲什麼This thread didn't help me, although it should.將通用擴展方法添加到接口,如IEnumerable

當然,我擡頭一看怎麼樣,我到處看看他們說這很簡單,它應該在這個語法:
(在某些地方,我讀了我需要添加「其中T:類型]」參數decleration後,但我的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()); 
    } 
} 

但是,這是行不通的,我得到這個錯誤:

The type or namespace name 'T' could not be found (are you missing a using directive or an assembly reference?)

如果我再更換

public static class TExtensions 

通過

public static class TExtensions<T> 

它給出了這樣的錯誤:

Extension method must be defined in a non-generic static class

任何幫助將非常感激,我真的被困在這裏。

回答

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

+0

天啊,我知道這是愚蠢的。謝謝一堆!不能相信我錯過了那個> – FrieK

0

您還沒有真正建立通用的方法,你都宣稱非geeneric方法,返回List<T>沒有定義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()); 
     } 
    }