2010-12-20 10 views
6

Considere estas propiedades,Lista/Recolección de referencias a las propiedades

 double _temperature; 
     public double Temperature 
     { 
      get { return _temperature; } 
      set { _temperature = value; } 
     } 
     double _humidity; 
     public double Humidity 
     { 
      get { return _humidity; } 
      set { _humidity = value; } 
     } 
     bool _isRaining; 
     public bool IsRaining 
     { 
      get { return _isRaining; } 
      set { _isRaining = value; } 
     } 

y ahora quiero hacer una lista/colección/contenedor de propiedades similares,

PropertyContainer.Add(Temperature); //Line1 
PropertyContainer.Add(Humidity);  //Line2 
PropertyContainer.Add(IsRaining); //Line3 

Quiero hacer esto de modo que más tarde pueda acceder al actual valores de propiedades usando el índice, algo como esto,

object currentTemperature = PropertyContainer[0]; 
object currentHumidity = PropertyContainer[1]; 
object currentIsRaining = PropertyContainer[2]; 

Pero, obviamente, esto no va a funcionar, ya que PropertyContainer[0] devolverá el valor antiguo - el valor, que Temperature tenían en el momento de la adición de Temperature al contenedor (ver el Line1 arriba).

¿Hay alguna solución a este problema? Básicamente quiero acceder actual valores de las propiedades uniformemente; lo único que puede cambiar es el índice. El índice, sin embargo, también podría ser una cadena.

PD: ¡No quiero usar Reflection!

Respuesta

9

Bueno, se podría utilizar Lambdas:

List<Func<object>> PropertyAccessors = new List<Func<object>>(); 
PropertyAccessors.Add(() => this.Temperature); 
PropertyAccessors.Add(() => this.Humidity); 
PropertyAccessors.Add(() => this.IsRaining); 

entonces posible para esto:

object currentTemperature = PropertyAccessors[0](); 
+0

esta es una solución impresionante. después de publicar la pregunta, obtuve la misma solución de [otro tema] (http://stackoverflow.com/questions/1402803/c-passing-properties-by-reference). muchas gracias por la respuesta rápida con este truco increíble! – Nawaz

+1

Puede marcarlo como respuesta si lo ayudó. :) – Botz3000

+1

Oops, me olvidé de eso. En realidad, antes de que me pidiera que esperara 5 minutos, Dios sabe por qué. De todos modos, respuesta aceptada y +1 de mi parte. – Nawaz

Cuestiones relacionadas