2010-01-11 29 views
6

Se ho un'interfaccia generica con un paio di classi, come attuazione:Elenco di interfacce generiche

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; } 
} 

E 'possibile passare una collezione di classi di attuazione di tipi diversi, senza dover ricorrere a scomparsa come oggetto.

non sembra essere possibile definire un valori di ritorno come

public IDataElement<T>[] GetData() 

o

public IDataElement<object>[] GetData() 

Qualche suggerimento?

risposta

4

Si può certamente dichiarare:

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

e

public IDataElement<object>[] GetData() 
  • anche se quest'ultimo probabilmente non è quello che stai dopo (l'interfaccia non sarà variante anche in C# 4 poiché utilizza T sia in input che in output, anche se fosse una variante, non sarebbe possibile utilizzare tale varianza per i tipi di valore). Il primo richiederà al chiamante di specificare <T>, ad es.

    foo.GetData<string>();

È che va bene per te?

Non c'è modo di esprimere "una raccolta di oggetti, ognuno dei quali implementa IDataElement<T> per una T diversa" a meno che non si assegni a una classe base non generica, in cui è possibile utilizzare semplicemente IList<IDataElement>. In questo caso il non generico IDataElement potrebbe avere la proprietà DataElement, lasciando la proprietà Value nell'interfaccia generica:

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

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

È che utili nella vostra situazione particolare?

Non è chiaro come si vorrebbe utilizzare una raccolta di elementi di dati senza conoscerne il tipo ... se quanto sopra non ti aiuta, potresti dire di più su cosa ti aspettavi di fare con le collezioni.

+0

Avevo provato la classe base non generica ma perde il dettaglio della proprietà Value – benPearce

+0

@benPearce: Ma non è possibile utilizzarlo comunque, perché non si conosce il tipo in questione. Si prega di provare a mostrare come si utilizza il codice e quindi possiamo consigliarvi meglio. –

+0

Ho finito per passare all'interfaccia di base non generica, con i metodi oggetto GetValue() e SetValue (oggetto). Funzionando così lontano – benPearce

3

No, non si può fare questo - le uniche opzioni sono o utilizzare un'interfaccia non generica:

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

creare alternativa un wrapper e pass che per i metodi che conoscono i tipi di cui hanno bisogno:

Problemi correlati