2010-05-27 1 views
1

J'ai ce code:Comment créer une propriété de type classe générique?

public class SelectionList<T> : ObservableCollection<SelectionItem<T>> where T : IComparable<T> 
{ 
    // Code 
} 

public class SelectionItem<T> : INotifyPropertyChanged 
{ 
// Code 
} 

Je dois créer une propriété qui est du type SelectionList comme suit:

public SelectionList<string> Sports { get; set; } 

Mais quand je remplace la chaîne avec DataRowView, comme

public SelectionList<DataRowView> Sports { get; set; }` 

Je reçois une erreur. Pourquoi ça ne marche pas?

Répondre

5

Votre problème est que string implémente IComparable<string> et DataRowView ne fonctionne pas.

SelectionList<T> a une contrainte que T doit implémenter IComparable<T>, d'où l'erreur.

public class SelectionList<T> : ObservableCollection<SelectionItem<T>> where T : IComparable<T> 
{ 
    // Code 
} 

Une solution serait de sous-classe DataRowView et mettre en œuvre IComparable:

public class MyDataRowView : DataRowView, IComparable<DataRowView>{ 
    int CompareTo(DataRowView other) { 
    //quick and dirty comparison, assume that GetHashCode is properly implemented 
    return this.GetHashCode() - (other ? other.GetHashCode() : 0); 
    } 
} 

Ensuite SelectionList<MyDataRowView> devrait compiler correctement.

+0

Bonjour, J'ai les questions suivantes: 1. Par "sous-classe DataRowView", voulez-vous dire la sous-classe de SelectionList? 2. Dois-je remplacer GetHashCode? – Relativity

+0

Non non, 'DataRowView'. 'GetHashCode' est seulement là comme un hack rapide. 'CompareTo' devrait renvoyer une valeur entière indiquant si' this' est inférieur, égal ou supérieur à 'other' dans la mesure où l'ordre de tri va. –

+0

Pouvez-vous répondre à ma première question? – Relativity

4

Vous avez une contrainte sur votre classe where T : IComparable<T>. DataRowView n'implémente pas IComparable<DataRowView> et ne peut donc pas être utilisé dans ce cas.

Voir ici pour plus d'informations sur les contraintes génériques: http://msdn.microsoft.com/en-us/library/d5x73970.aspx