2010-04-12 18 views
6

Ho proprietà chiamate reel1, reel2, reel3 e reel4. Come posso fare riferimento dinamico a queste proprietà semplicemente passando un numero intero (1-4) al mio metodo?Come faccio a fare riferimento dinamicamente alle proprietà incrementate in C#?

In particolare, sto cercando come ottenere un riferimento a un oggetto senza conoscere il nome dell'oggetto.

in JavaScript, farei:

temp = eval("reel" + tempInt); 

e temperatura sarebbe pari a reel1, l'oggetto.

Non riesco a capire questo semplice concetto in C#.

+1

In Javascript, è così che si potrebbe * farlo, ma a meno che non ci sia una buona ragione, stare lontano, molto lontano da "eval". –

+0

Sì, non c'è bisogno di eval: basta usare la notazione della parentesi, come 'myObj ['reel' + tempInt]'. Nota se queste sono proprietà globali, il tuo oggetto sarebbe 'window' - quindi' window ['reel' + tempInt] ' – jbyrd

risposta

0

È possibile accedere al valore della proprietà tramite la stringa contenente il nome della proprietà utilizzando PropertyInfo.

Esempio:

PropertyInfo pinfo = this.GetType().GetProperty("reel" + i.ToString()); 
return (int)pinfo.GetValue(this, null); 
6

Questo è qualcosa che è generalmente evitata in C#. Ci sono spesso altre alternative migliori.

Detto questo, è possibile utilizzare la riflessione per ottenere il valore di una proprietà come questa:

object temp = this.GetType().GetProperty("reel" + tempInt.ToString()).GetValue(this, null); 

Un'alternativa migliore, tuttavia, potrebbe essere quella di utilizzare un Indexed Property sulla tua classe, che permetterebbe di fare this[tempInt].

+2

Giusto per reiterare, NON farlo. Usa un indicizzatore –

0

Prova this link Prendi l'oggetto PropertyInfo corrispondente per la proprietà e quindi utilizzare GetValue su di essa passando l'istanza in cui si desidera valutare la proprietà

0

Questa è una delle cosa si può farla franca in un interpretato linguaggio come javascript, molto difficile in un linguaggio compilato come C#. Meglio prendere un'altra tattica:

switch(tempInt) 
{ 
    case 1: 
     temp = reel1; 
     break; 
    case 2: 
     temp = reel2; 
     break; 
    case 3: 
     temp = reel3; 
     break; 
} 
0

Usa InvokeMember, con BindingFlags.GetProperty. Devi avere un riferimento all'oggetto "possedere" e devi conoscere il tipo di proprietà che stai cercando di recuperare.

namespace Cheeso.Toys 
{ 
    public class Object1 
    { 
     public int Value1 { get; set; } 
     public int Value2 { get; set; } 
     public Object2 Value3 { get; set; } 
    } 

    public class Object2 
    { 
     public int Value1 { get; set; } 
     public int Value2 { get; set; } 
     public int Value3 { get; set; } 
     public override String ToString() 
     { 
      return String.Format("Object2[{0},{1},{2}]", Value1, Value2, Value3); 
     } 
    } 

    public class ReflectionInvokePropertyOnType 
    { 

     public static void Main(string[] args) 
     { 
      try 
      { 
       Object1 target = new Object1 
        { 
         Value1 = 10, Value2 = 20, Value3 = new Object2 
          { 
           Value1 = 100, Value2 = 200, Value3 = 300 
          } 
        }; 

       System.Type t= target.GetType(); 

       String propertyName = "Value3"; 

       Object2 child = (Object2) t.InvokeMember (propertyName, 
                  System.Reflection.BindingFlags.Public | 
                  System.Reflection.BindingFlags.Instance | 
                  System.Reflection.BindingFlags.GetProperty, 
                  null, target, new object [] {}); 
       Console.WriteLine("child: {0}", child); 
      } 
      catch (System.Exception exc1) 
      { 
       Console.WriteLine("Exception: {0}", exc1.ToString()); 
      } 
     } 
    } 
} 
Problemi correlati