2010-08-25 23 views
6

Tengo una función que devuelve objetos de diferentes tipos según el parámetro pasado a esta función. ¿Es posible agregar estos diferentes tipos de objetos a una colección basada en algún identificador en C# 4.0? Normalmente hacemos algo como esto List o List pero quiero una colección que pueda agregar objeto de cualquier tipo.Agregar diferentes tipos de objetos a una colección C# 4.0

+0

es el tipo de retorno de su objeto de función (o alguna de las interfaces que todos los tipos de objetos que devuelve poner en práctica)? –

Respuesta

4

Usted podría utilizar object[], List<object>, ArrayList, IEnumerable, ... pero si esos tipos tienen un tipo de base común sería mejor atenerse a una colección con establecimiento inflexible.

+2

Extraño ArrayList :( – leppie

+0

+1 Has llegado antes que yo :) –

7

Sí, se llama object. Por ejemplo:

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

Si desea una colección que se puede añadir objetos de cualquier tipo a continuación List<object> es el tipo más adecuado.

1

Las colecciones en versiones anteriores de C# (no genéricos) pueden contener cualquier tipo de objetos. Si son del tipo de valor, se incluirán en el objeto. Cuando necesite usarlos, puede simplemente convertirlos al tipo original.

Puede usar List<Type> para almacenar la información del tipo, si eso es lo que desea. Y Type [], Hashtable, etc. también están bien. Puede usar el operador typeof para obtener el tipo o usar Object.GetType().

3

Realmente su colección debe ser tan específica como usted puede hacerlo. Cuando usted dice

objetos de diferentes tipos

¿Estos objetos tienen algo en común? ¿Implementan una interfaz común?
Si es así, puede especializarse en la lista en dicha interfaz List<IMyInterface>

De lo contrario List<object> va a hacer lo que quiera.

actualización

No, no realmente.

Lo siento pero voy a cuestionar su diseño.
Si tiene una colección de objetos diferentes, ¿cómo decide cómo usar uno de los objetos?
Tendrás una declaración de interruptor grande que activará el tipo de objeto, luego lo lanzarás a un objeto específico y lo usarás.

También tiene una instrucción de cambio similar en su método de fábrica que crea el objeto.

Uno de los beneficios de la Orientación de objetos es que si diseñas tus objetos correctamente, entonces no necesitas hacer estos grandes "Si es este objeto haz esto. Método(), si es ese objeto hazlo. Método Orte () ".

¿Puedo preguntar por qué están poniendo diferentes objetos en la misma colección? ¿Cuál es el beneficio para ti?

+0

Lo hacen, pero lo he enmarcado de esa manera para que compartan el mismo padre. La principal parte es que tienen una implementación diferente y métodos adicionales. Así que si doy interfaz, me perdería los métodos adicionales en las clases individuales. ¿Hay alguna implementación de patrón que pueda aconsejar? – SharpD

9

En lugar de simplemente hacer una List<object> al igual que otros carteles están recomendando, es posible que desee definir un ejemplo de interfaz IListableObject que contiene algunos métodos que los objetos tienen que poner en práctica. Esto hará que cualquier código que use estos objetos sea mucho más fácil de escribir y evitará que los objetos no deseados ingresen a la colección más adelante.

0

Mi sugerencia:

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

clase Uso parámetro como collectio a sus valores, puede convertir la vuelta a cada tipo que desea.

0

se puede utilizar una tupla de Tipos Genric

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

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

El .NET Framework admite directamente tuplas con uno a siete elementos. Además, puede crear tuplas de ocho o más elementos anidando objetos de tupla en la propiedad Rest de un objeto Tuple.

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

Cuestiones relacionadas