2010-08-25 6 views
6

Ho una funzione che restituisce oggetti di tipi diversi in base al parametro passato a questa funzione. È possibile aggiungere questi diversi tipi di oggetto a una raccolta basata su un identificatore in C# 4.0? Di solito facciamo qualcosa di simile alla lista o all'elenco ma voglio una collezione che possa aggiungere oggetti di qualsiasi tipo.Aggiunta di diversi tipi di oggetto a una collezione C# 4.0

+0

è il tipo di ritorno del vostro oggetto funzione (o un po 'di interfaccia che tutti i tipi di oggetto restituisce implementare)? –

risposta

4

Si potrebbe utilizzare object[], List<object>, ArrayList, IEnumerable, ... ma se quei tipi hanno un tipo di base comune sarebbe meglio attenersi a un insieme fortemente tipizzato.

+2

Mi manca ArrayList :( – leppie

+0

+1 Sei entrato prima di me :) –

7

Sì, si chiama object. Ad esempio:

var objlist = new List<object>(); 
objlist.Add(1); 
objlist.Add(true); 
objlist.Add("hello"); 
1

Se si desidera una collezione che può aggiungere oggetti di qualsiasi tipo, allora List<object> è il tipo più appropriato.

1

Le raccolte di versioni precedenti di C# (non generiche) possono contenere qualsiasi tipo di oggetto. Se sono di tipo valore, verranno inseriti nell'oggetto. Quando devi usarli, puoi semplicemente lanciarli sul tipo originale.

È possibile utilizzare List<Type> per contenere le informazioni sul tipo, se questo è ciò che si desidera. E digita anche [], Hashtable, ecc. È possibile utilizzare l'operatore typeof per ottenere il tipo o utilizzare Object.GetType().

3

In realtà la tua raccolta dovrebbe essere il più specifica possibile. Quando si dice

oggetti di tipo diverso

fare questi oggetti hanno qualcosa in comune? Implementano un'interfaccia comune?
Se è così si è possibile specializzarsi l'elenco su tale interfaccia List<IMyInterface>

Altrimenti List<object> farà quello che vuoi.

Aggiornamento

No, non proprio.

Mi dispiace ma ho intenzione di mettere in discussione il tuo progetto.
Se si dispone di una raccolta di oggetti diversi, come si decide come utilizzare uno degli oggetti?
Avrai un'istruzione switch di grandi dimensioni che attiva il tipo di oggetto, quindi lanci su un oggetto specifico e lo usi.

Hai anche un'istruzione switch simile nel metodo factory che crea l'oggetto.

Uno dei vantaggi dell'orientamento degli oggetti è che se si progettano gli oggetti correttamente, non è necessario eseguire questi grandi "Se si tratta di questo oggetto, fare questo.Method(), se è quell'oggetto farlo.OtherMethod ()".

Posso chiederti, perché stai mettendo diversi oggetti nella stessa collezione? Qual è il vantaggio per te?

+0

Lo fanno ma l'ho incorniciato in questo modo in modo che condividano lo stesso genitore. La parte peggiore è che hanno un'implementazione diversa e metodi aggiuntivi. Se io do interfaccia, vorrei perdere i metodi aggiuntivi nelle singole classi. Esiste un modello di implementazione che potresti consigliare? – SharpD

9

Invece di creare semplicemente un List<object> come altri utenti raccomandano, è possibile che si desideri definire un'interfaccia, ad esempio IListableObject contenente alcuni metodi che gli oggetti devono implementare. Ciò renderà molto più facile scrivere qualsiasi codice usando questi oggetti e proteggerà gli oggetti indesiderati che entrano nella collezione lungo la linea.

0

Il mio suggerimento:

public class ParamValue 
{ 
    object value = null; 
    public ParamValue(object val) 
    { 
     value = val; 
    } 

    public string AsString() 
    { 
     return value.ToString(); 
    } 

    public int AsInt() 
    { 
     return int.Parse(value.ToString()); 
    } 

    public int? AsNullableInt() 
    { 
     int n; 

     if (int.TryParse(value.ToString(), out n)) 
     { 
      return n; 
     } 

     return null; 
    } 

    public bool AsBool() 
    { 
     return bool.Parse(value.ToString()); 
    } 

    public bool? AsNullableBool() 
    { 
     bool b; 

     if (bool.TryParse(value.ToString(), out b)) 
     { 
      return b; 
     } 

     return null; 
    } 
} 

public class Params 
{ 
    Dictionary<string, object> paramCol = new Dictionary<string, object>(); 

    public void Add(string paramName, object value) 
    { 
     paramCol.Add(paramName, value); 
    } 

    public ParamValue this[string paramName] 
    { 
     get 
     { 
      object v; 

      if (paramCol.TryGetValue(paramName, out v)) 
      { 
       return new ParamValue(v); 
      } 

      return null; 
     } 
    } 
} 

classe Utilizzare param come collectio ai vostri valori, è possibile convertire il ritorno ad ogni tipo che si desidera.

0

Si potrebbe utilizzare una tupla di Genric Tipi

public Tuple<T, T> MySuperMethod() 
{ 
    int number = 1; 
    string text = "Batman"; 

    return new Tuple<int, string>(number, text); 
} 

.NET Framework supporta direttamente tuple con uno a sette elementi. Inoltre, è possibile creare tuple di otto o più elementi annidando gli oggetti tupla nella proprietà Rest di un oggetto Tupla.

https://msdn.microsoft.com/en-us/library/system.tuple(v=vs.100).aspx

Problemi correlati