2010-05-05 4 views
3

Avec réflexion, vous pouvez rechercher une classe à partir d'une chaîne à l'exécution, mais vous pouvez aussi dire typeof (Foo) et obtenir la compilation vérification du type de temps, l'achèvement automatique, etc.C# équivalent de typeof pour les champs

Si ce que vous voulez est un champ pas une classe, vous pouvez le rechercher à partir d'une chaîne au moment de l'exécution, mais si vous voulez compiler le contrôle du temps etc., est-ce qu'il y a quelque chose comme fieldof (Foo.Bar)? Je connais le nom de la classe et du champ à l'avance, et je veux pouvoir me référer au champ au moment de la compilation plutôt qu'avec une recherche de chaîne au moment de l'exécution.

edit: Un exemple de ce que je veux utiliser pour cela, disons que j'ai une liste d'objets qui peuvent avoir été lus à partir d'une base de données, et je veux les afficher dans un DataGridView, mais je veux seulement colonnes pour certains champs. Je voudrais écrire une méthode quelque chose comme:

void DisplayData(object[] objs, params FieldInfo[] fields) 

et pouvoir l'appeler comme

DisplayData(accounts, fieldof(Account.Name), fieldof(Account.Email)); 

Ce genre d'idée.

+0

Un petit morceau de code pour illustrer votre question vous aidera à obtenir de meilleures réponses –

+0

Il semble que vous tiriez le même type de classe de plusieurs assemblages. Si c'est le cas, vous pouvez envisager d'utiliser une interface et de faire votre type de temps de compilation en vérifiant cela. Vous pouvez ensuite affecter la variable d'instance à l'assembly chargé dynamiquement et tout ira bien. –

+0

gbogumil - juste l'ensemble, mais plusieurs endroits dans le code où je veux faire une certaine opération sur différents champs de classes différentes, et donc besoin de pouvoir spécifier quels champs. J'ai ajouté un échantillon de code qui, je l'espère, pourrait clarifier. – rwallace

Répondre

5

Vous pouvez vous débarrasser de littéraux de chaîne en utilisant des expressions

public static PropertyInfo GetProperty<T>(Expression<Func<T, object>> expression) 
{ 
    MemberExpression memberExpression = null; 

    if (expression.Body.NodeType == ExpressionType.Convert) 
    { 
     memberExpression = ((UnaryExpression)expression.Body).Operand as MemberExpression; 
    } 
    else if (expression.Body.NodeType == ExpressionType.MemberAccess) 
    { 
     memberExpression = expression.Body as MemberExpression; 
    } 

    return memberExpression.Member as PropertyInfo; 
} 

// usage: 
PropertyInfo p = GetProperty<MyClass>(x => x.MyCompileTimeCheckedPropertyName); 
0

Pas pour les champs. Le plus proche que vous pouvez obtenir est un 'using alias' qui vous permet de spécifier des noms alternatifs pour les types: par exemple, en utilisant foo = System.Collections.Generic.List;