通用列表上的扩展方法

时间:2010-10-14 20:20:53

标签: c# interface extension-methods

我对C#很陌生,对通用列表和扩展方法有两个问题。对不起,如果问题有点愚蠢..

有什么区别:

public static IObjectWithTempID FindByTempID
    (this ObservableCollection<IObjectWithTempID > list, long tempID) 

public static IObjectWithTempID FindByTempID< E >
   (this ObservableCollection< IObjectWithTempID > list, long tempID)

我试过阅读这个主题,但仍然不明白:$

我遇到了一个奇怪的问题。当我宣布ObservableCollection时,例如此

ObservableCollection<TestObjectWithTempID> a =
    new ObservableCollection<TestObjectWithTempID>();

可以调用扩展方法

public static long FindByTempID
    (this IEnumerable< IObjectWithTempID > list, long tempID){}
列表上的

。令人惊讶的是,无法调用扩展方法

public static long FindByTempID
    (this ObservableCollection< IObjectWithTempI D> list, long tempID){} 

虽然。我在这里错过了什么?

3 个答案:

答案 0 :(得分:5)

对于2,它必须是:

TheMethod<T>(ObservableCollection<T> list)
    where T : ISomeInterface

否则,您可以尝试将任何 ISomeInterface实例添加到更具体的列表中。

答案 1 :(得分:1)

关于你的第一个问题:

在第二种方法声明中,FindByTempID<E>中的E是type parameter。换句话说,它是类型的占位符,而不是实际类型。 E可以在方法体中使用,就像它是真实类型一样。此类编程的一般术语是泛型

答案 2 :(得分:0)

拥有这些扩展方法

public static class Extenders
{
    public static void FindByTempID(this ObservableCollection<IObjectWithTempID> e, long tempID)
    {
    }
    public static void FindByTempID2(this IEnumerable<IObjectWithTempID> e, long tempID)
    {
    }
    public static void FindByTempID3(this ObservableCollection<TestObjectWithTempID> e, long tempID)
    {
    }
    public static void FindByTempID4<T>(this ObservableCollection<T> e, long tempID)
    {
    }
}

然后

var a1 = new ObservableCollection<TestObjectWithTempID>();
var a2 = new ObservableCollection<IObjectWithTempID>();

//a1.FindByTempID(1); /* Is not a collection of interface */
a1.FindByTempID2(1); // IEnumerable<T> is a generic list
a1.FindByTempID3(1); // It is a collection of TestObjectWithTempID
a1.FindByTempID4(1); // Identify the collection as ObservableCollection<TestObjectWithTempID>

a2.FindByTempID(1); // Is a collection of interface
a2.FindByTempID2(1); // IEnumerable<T> is a generic list
//a2.FindByTempID3(1); /* Is not a collection of TestObjectWithTempID */
a2.FindByTempID4(1); // Identify the collection as ObservableCollection<IObjectWithTempID>

IEnumerable<T>