2009-09-13 4 views
1

J'écris une classe d'utilité mais comment obtenir le nom? Est-ce que cela peut envoyer le nom du paramètre à Mehod sans utiliser object.Name?Comment obtenir des propriétés Les noms des paramètres d'objet?

class AutoConfig_Control { 
      public List<string> ls; 
      public AutoConfig_Control(List<string> lv) 
      { 
       ls = lv; 
      } 
      public void Add(object t) 
      { 
       //t.Name; << How to do this 
       //Howto Get t.Name in forms? 

       ls.Add(t.ToString()); 
      } 
     } 
     class AutoConfig 
     { 
      List<string> ls = new List<string>(); 
      public string FileConfig 
      { 
       set; 
       get; 
      } 

      public AutoConfig_Control Config 
      { 
       get { 
        AutoConfig_Control ac = new AutoConfig_Control(ls); 
        ls = ac.ls; 
        return ac; 
       } 
       //get; 
      } 

      public string SaveConfig(object t) { 
       return ls[0].ToString(); 
      } 
     } 

Exemple À utiliser.

AutoConfig.AutoConfig ac = new AutoConfig.AutoConfig(); 
    ac.Config.Add(checkBox1.Checked); 
    MessageBox.Show(ac.SaveConfig(checkBox1.Checked)); 

Répondre

2

La seule façon que je connaisse est un hack comme ceci:

/// <summary> 
    /// Gets the name of a property without having to write it as string into the code. 
    /// </summary> 
    /// <param name="instance">The instance.</param> 
    /// <param name="expr">An expression like "x => x.Property"</param> 
    /// <returns>The name of the property as string.</returns> 
    public static string GetPropertyName<T, TProperty>(this T instance, Expression<Func<T, TProperty>> expr) 
     { 
      var memberExpression = expr.Body as MemberExpression; 
      return memberExpression != null 
       ? memberExpression.Member.Name 
       : String.Empty; 
     } 

Si vous le placez dans une classe statique vous obtiendrez la méthode d'extension getPropertyName.

Ensuite, vous pouvez l'utiliser dans votre exemple comme

checkbox1.GetPropertyName(cb => cb.Checked) 
+0

puis-je utiliser ac.Config.Add (checkBox1.Checked); même chose mais avoir checkBox1.Name –

1

Fin de réponse Rauhotz: Expression.Body pourrait être un UnaryExpression (pour les propriétés booléennes par exemple) Voici ce que vous devez faire pour travailler avec ce genre d'expressions:

var memberExpression =(expression.Body is UnaryExpression? expression.Body.Operand :expression.Body) as MemberExpression; 
+0

Peut-être que nous pouvons développer ici une fonction générale GetMemberName, qui fonctionne avec les propriétés, les méthodes, etc – Rauhotz

+0

C'est une bonne idée :) – Beatles1692

Questions connexes