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
Respuesta
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.
Extraño ArrayList :( – leppie
+1 Has llegado antes que yo :) –
Sí, se llama object
. Por ejemplo:
var objlist = new List<object>();
objlist.Add(1);
objlist.Add(true);
objlist.Add("hello");
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.
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().
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?
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
También consulte Tipo dinámico.
http://msdn.microsoft.com/en-us/library/dd264736.aspx
Básicamente va a hacer lo mismo.
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.
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.
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
- 1. Agregar colección de objetos a otra colección de objetos sin iterar
- 2. VBA - Cómo agregar una colección a una colección de colecciones
- 3. C colección # basura con referencias a objetos
- 4. C# pasar una colección de objetos InterfaceImplementingClass a una rutina que lleva una colección de interfaz .NET objetos
- 5. ¿Tipos anónimos a una matriz de objetos?
- 6. VBA Agregar una clase a una colección
- 7. Sincronización de una colección de objetos envueltos con una colección de objetos sin envolver
- 8. Ordenar una colección de objetos
- 9. Agregar objetos a objetos existentes
- 10. ¿Usar la liberación automática antes de agregar objetos a una colección?
- 11. C# 4.0 Implícitamente Typed objetos dinámicos
- 12. Mixins con C# 4.0
- 13. C# agregar objetos (similar a delegados)
- 14. colección de tipos genéricos
- 15. ¿Cómo almacenar objetos de diferentes tipos en un contenedor?
- 16. Colección de tipos genéricos
- 17. Indexación de diferentes tipos de entidades/objetos con Solr Lucene
- 18. ¿Puedo poner diferentes tipos de objetos en el mismo NSMutableArray?
- 19. ¿Almacena diferentes tipos dentro de una lista?
- 20. comparar y ordenar diferentes tipos de objetos usando java Colecciones
- 21. ¿Cómo almacenar diferentes tipos de datos en una lista? (C++)
- 22. C# Pasando una colección como una colección de interfaces
- 23. ¿Puede NSDictionary contener diferentes tipos de objetos como valores?
- 24. Agregar objetos a una matriz de objetos en Powershell
- 25. AutoMapper: asignación de una colección de objetos a una colección de cadenas
- 26. ¿Por qué diferentes tipos de puntero para diferentes tipos de datos en c?
- 27. Cómo devuelvo una matriz/lista/colección de objetos desde C# a VB6
- 28. RESTO - Eliminar una colección de objetos
- 29. Agregar objetos a una lista J
- 30. XStream - Rootear como una colección de objetos
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)? –