2010-10-14 17 views
2

Je suis assez nouveau en C#, et j'ai deux questions concernant les listes génériques et les méthodes d'extension. Désolé si les questions sont un peu stupide ..Méthode d'extension sur la liste générique

Quelle est la différence entre:

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

et

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

J'ai essayé de lire sur le sujet, mais encore ne pas comprendre: $

J'ai rencontré un problème étrange. Quand je déclare un ObservableCollection, comme ce

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

il est possible d'appeler la méthode d'extension

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

sur la liste. Il est étonnamment impossible d'appeler la méthode d'extension

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

cependant. Qu'est-ce que j'ai manqué ici?

+0

ne peut pas lire votre code :( – jlafay

Répondre

1

Pour votre première question:

Dans la deuxième déclaration de méthode E dans FindByTempID<E> est un type parameter. En d'autres termes, il s'agit d'un placeholder pour un type, pas un type réel. E peut être utilisé dans le corps de la méthode comme s'il s'agissait d'un type réel. Le terme général pour ce type de programmation est génériques.

5

Pour 2, il doit être:

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

Sinon, vous pourriez essayer d'ajouter une ISomeInterface exemple à une liste plus précise.

0

ces méthodes Avoir l'extension

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) 
    { 
    } 
} 

Puis

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>