2010-04-20 4 views
4

J'ai vu l'inverse de cette question plusieurs fois, mais je n'ai pas vu comment faire ce que je voudrais.Obtenez une représentation sous forme de chaîne d'une propriété en C# à l'exécution

Supposons que je le code suivant:

var myNewData = from t in someOtherData 
      select new 
      { 
       fieldName = t.Whatever, 
       fieldName2 = t.SomeOtherWhatever 
      }; 

Si je veux lier des données à cette classe, ma définition de la colonne devrait inclure des chaînes codées en dur comme « fieldName » et « FieldName2 ». Y at-il un moyen d'appeler la réflexion ou autre chose pour que je puisse faire quelque chose d'équivalent au code ci-dessous (je sais que le code ci-dessous n'est pas valide, mais je cherche une solution valide).

string columnName = GetPropertyName(myNewData[0].fieldName); 

Mon but est que si les changements de nom variables sur la classe anonyme, une erreur de compilation monteraient jusqu'à ce que toutes les références ont été fixés, contrairement aux données actuelles de liaison qui repose sur des chaînes qui ne sont pas vérifiées avant l'exécution .

Toute aide serait appréciée.

Répondre

7
string columnName = GetPropertyName(() => myNewData[0].fieldName); 

// ... 

public static string GetPropertyName<T>(Expression<Func<T>> expr) 
{ 
    // error checking etc removed for brevity 

    MemberExpression body = (MemberExpression)expr.Body; 
    return body.Member.Name; 
} 
+0

C'est exactement ce que je cherchais. Merci. – gwerner

+0

+1 Une approche intelligente! Quand j'ai pensé à passer le champ à une méthode, juste la référence à la valeur est passée, ainsi vous n'avez aucune chance de trouver jamais le nom du champ passé. Mais passer un arbre d'expression via lambda résout ce problème. Solution cool :) –

2

Vous obtenez vos noms de propriétés comme ceci:

using System.Reflection;  

var myNewData = from t in someOtherData 
     select new 
     { 
      fieldName = t.Whatever, 
      fieldName2 = t.SomeOtherWhatever 
     }; 


foreach (PropertyInfo pinfo in myNewData.FirstOrDefault() 
           .GetType().GetProperties()) 
{ 
    string name = pinfo.Name; 
} 

// or if you need all strings in a list just use: 
List<string> propertyNames = myNewData.FirstOrDefault() 
      .GetType().GetProperties().Select(x => x.Name).ToList(); 
+0

Cela ne répond pas vraiment à la question. – LukeH

+0

Je pense que oui, l'OP voulait savoir comment faire quelque chose de similaire à la ligne de code qu'il affichait, c'est-à-dire: obtenir les noms des propriétés du type anonyme en tant que chaînes. Il pourrait ensuite vérifier la liste des chaînes par rapport à une autre liste de chaînes, qui est codée en dur, pour être sûr que le type anonyme a le bon ensemble de propriétés auxquelles il tente d'accéder plus tard. –

+0

Mon interprétation est que l'OP veut pouvoir passer une propriété particulière dans une méthode 'GetPropertyName' et avoir le nom de cette propriété retourné comme une chaîne. – LukeH

Questions connexes