2010-10-13 17 views
1

Eh bien, je ne suis pas seul qui est d'être malade des cordes magiques qui sont constamment utilisés juste pour faire la liaison de données - voir:Ajout NomDe à C# par backdoors

How to make Databinding type safe and support refactoring

Cependant, je suis préoccupé par la performance de cette solution et beaucoup plus de frappe - chaque fois que vous souhaitez utiliser nameof vous devez taper un lambda. Donc je pense à plus de méthode brute-force - écrire une fonction nameof et un programme externe, qui va changer chaque fichier .cs avant qu'il ne soit compilé.

public string nameof<T>(T obj,string name = null) 
{ 
    return name; 
} 

Vous utiliseriez cette façon

nameof(the_object.MyProperty); 

La clé réside dans le programme externe aidant NomDe - il rechercherait un appel de la NomDe, et il suffit de remplacer

nameof(X.Y.Z) 

ou

nameof(X.Y.Z,"s") 

dans Ma question est - quelles limites, pièges de cette approche voyez-vous? Ou peut-être .Net 5.0 avec le nom intégré sera envoyé la semaine prochaine, donc cela n'a aucun sens de commencer à écrire un programme pour cela? ;-)

Merci d'avance pour vos idées, recommandations, etc.

+1

Si vous souhaitez cette fonctionnalité dans 5.0, ne retenez pas votre souffle, il ne sera probablement pas arriver ... voir [cet article] (http://blogs.msdn.com/b/ericlippert/archive/2009/05/21/in-foof-we-trust-a-dialogue.aspx) pour les raisons pourquoi . (mais je suis d'accord que ce serait très pratique, au moins pour les propriétés si ce n'est pour les méthodes) –

Répondre

3

Effectuer des modifications de code de pré-compilation serait un tracas extrême. Donc je l'éviterais. Je ne m'inquiéterais pas trop de la performance - la plupart du temps quand vous avez besoin d'un nom de propriété comme une chaîne que vous finirez par faire de la réflexion ou des E/S, la performance sera relativement lente de toute façon.

Voici ce que je suggère d'utiliser:

public static string ToPropertyName<T>(this Expression<Func<T>> @this) 
{ 
    var @return = string.Empty; 
    if (@this != null) 
    { 
     var memberExpression = @this.Body as MemberExpression; 
     if (memberExpression != null) 
     { 
      @return = memberExpression.Member.Name; 
     } 
    } 
    return @return; 
} 

Maintenant, vous pouvez faire ceci:

Expression<Func<T>> px = x => x.Foo; 
var pn = px.ToPropertyName(); // == "Foo" 
+1

Qu'est-ce que cette notation @return? Je n'ai jamais vu ça auparavant. – Alex

+2

@Alex: c'est confondre les autres programmeurs. Il vous permet d'utiliser des mots-clés comme noms de variables. – Henrik

+0

Merci d'avoir signalé un problème de performance. Maintenant, je pense à mettre pour chaque propriété dont j'ai besoin le nom, une propriété readonly statique qui tient son nom, de cette façon, le nom serait évalué une fois. – greenoldman