2010-01-11 5 views
6

Si j'ai une interface générique avec un couple de mettre en œuvre des classes telles que:Liste des interfaces génériques

public interface IDataElement<T> 
{ 
    int DataElement { get; set; } 
    T Value { get; set; } 
} 

public class IntegerDataElement : IDataElement<int> 
{ 
    public int DataElement { get; set; } 
    public int Value { get; set; } 
} 

public class StringDataElement : IDataElement<String> 
{ 
    public int DataElement { get; set; } 
    public String Value { get; set; } 
} 

Est-il possible de passer une collection des classes de mise en œuvre de types différents, sans avoir à recourir à passer comme objet.

Il ne semble pas possible de définir des valeurs de retour comme

public IDataElement<T>[] GetData() 

ou

public IDataElement<object>[] GetData() 

Toutes les suggestions?

Répondre

4

Vous pouvez certainement déclarer:

public IDataElement<T>[] GetData<T>() 

et

public IDataElement<object>[] GetData() 
  • bien que ce dernier est sans doute pas ce que vous êtes après (l'interface ne sera pas même variante en C# 4 car il utilise T à la fois dans une position d'entrée et une position de sortie, même s'il s'agissait d'une variante, vous ne seriez pas en mesure d'utiliser cette variance pour les types de valeur). Le premier demandera à l'appelant de spécifier <T>, par ex.

    foo.GetData<string>();

Est-ce que ça va pour vous?

Il n'y a aucun moyen d'exprimer "une collection d'objets, dont chacun implémente IDataElement<T> pour un T différent" à moins que vous lui donniez aussi une classe de base non générique, à laquelle vous pouvez simplement utiliser IList<IDataElement>. Dans ce cas, le non générique IDataElement pourrait avoir la propriété DataElement, en laissant la propriété Value dans l'interface générique:

public interface IDataElement 
{ 
    int DataElement { get; set; } 
} 

public interface IDataElement<T> : IDataElement 
{ 
    T Value { get; set; } 
} 

Est-ce utile dans votre situation particulière? Il n'est pas clair comment vous voudriez utiliser une collection d'éléments de données sans connaître leurs types ... si ce qui précède ne vous aide pas, peut-être pourriez-vous en dire plus sur ce que vous attendiez des collections.

+0

J'avais essayé la classe de base non générique mais elle perd le détail de la propriété Value – benPearce

+0

@benPearce: Mais vous ne pouvez pas l'utiliser quand même, car vous ne connaissez pas le type impliqué. Essayez de montrer comment vous utiliseriez le code, et nous pourrons mieux vous conseiller. –

+0

J'ai fini par descendre l'interface de base non générique, avec les méthodes GetValue() et SetValue (object) de l'objet. Travailler jusqu'à maintenant – benPearce

3

Non, vous ne pouvez pas faire cela - les seules options sont soit d'utiliser une interface non-générique:

public interface IDataElement 
{ 
    int DataElement { get; set; } 
    object Value { get; set; } 
} 

créer une enveloppe alternative et passer que les méthodes qui connaissent les types dont ils ont besoin:

Questions connexes