2010-12-10 4 views
1

Existe-t-il un moyen d'identifier dynamiquement les propriétés de temps de conception en C#? Par exemple:Identification dynamique des propriétés en C#

class MyClass 
{ 
    public string MyProperty1 { get; set; } 
} 

Et référence alors il quelque chose comme ceci:

string myVar = "MyProperty1"; 
MyClass.myVar = "test"; 

Répondre

6

Si vous souhaitez définir la valeur d'une propriété à l'exécution et le nom de la propriété est seulement connue lors de l'exécution dont vous avez besoin pour utiliser Reflection. Voici un exemple:

public class MyClass 
{ 
    public string MyProperty1 { get; set; } 
} 

class Program 
{ 
    static void Main() 
    { 
     // You need an instance of a class 
     // before being able to set property values    
     var myClass = new MyClass(); 
     string propertyName = "MyProperty1"; 
     // obtain the corresponding property info given a property name 
     var propertyInfo = myClass.GetType().GetProperty(propertyName); 

     // Before trying to set the value ensure that a property with the 
     // given name exists by checking for null 
     if (propertyInfo != null) 
     { 
      propertyInfo.SetValue(myClass, "test", null); 

      // At this point you've set the value of the MyProperty1 to test 
      // on the myClass instance 
      Console.WriteLine(myClass.MyProperty1); 
     } 

    } 
} 
+0

+1 pour mettre en évidence les propriétés et les champs doivent être accessibles différemment. – devrooms

0

Oui, bien sûr, vous pouvez. Vous devez obtenir un objet FieldInfo relatif à la propriété que vous souhaitez définir.

var field = typeof(MyClass).GetField("MyProperty1"); 

Ensuite, à partir de cet objet info de champ, vous pouvez définir la valeur de n'importe quelle instance de cette classe.

field.SetValue(myinstanceofmyclass, "test"); 

Voir MSDN: FieldInfo pour d'autres choses amusantes que vous pouvez faire avec la réflexion.

+1

Vous devez faire la distinction entre une [propriété] (http://msdn.microsoft.com/en-us/library/x9fsa0sw.aspx) et un [champ] (http://msdn.microsoft.com/fr-fr /library/ms173118.aspx) et utilisez les méthodes de réflexion correspondantes pour les manipuler. Dans ce cas, MyProperty1 est une propriété, donc l'appel de GetField renverra probablement null. –

1

que diriez-vous simplement mettre en œuvre un indexeur de votre classe

public class MyClass 
{ 
    public string MyProperty1 { get; set; } 

    public object this[string propName] 
    { 
     get 
     { 
      return GetType().GetProperty(propName).GetValue(this, null); 
     } 
     set 
     { 
      GetType().GetProperty(propName).SetValue(this, value, null); 
     } 
    } 
} 

et vous pouvez faire quelque chose de très similaire

var myClass = new MyClass(); 
string myVar = "MyProperty1"; 
myClass[myVar] = "test"; 
Questions connexes