4 votes

Pourquoi cela fonctionne-t-il ?

J'ai fait des recherches sur Google pour trouver un moyen d'appeler Control.DataBindings.Add sans utiliser de chaîne littérale, mais en obtenant le nom de la propriété à partir de la propriété elle-même, ce qui, à mon avis, serait moins sujet à erreur, du moins dans mon cas particulier, puisque je laisse normalement Visual Studio se charger de renommer une propriété. Mon code ressemblerait donc à quelque chose comme DataBindings.Add(GetName(myInstance.myObject)... au lieu de DataBindings.Add("myObject"... . Alors j'ai trouvé ça :

    static string GetName<T>(T item) where T : class
    {
        var properties = typeof(T).GetProperties();
        if (properties.Length != 1) throw new Exception("Length must be 1");
        return properties[0].Name;
    }

Cela s'appellerait, en supposant que j'ai une propriété appelée One de cette façon : string name = GetName(new { this.One }); ce qui me donnerait "One" . Je n'ai aucune idée de la raison pour laquelle cela fonctionne et si c'est sûr de l'utiliser ou non. Je ne sais même pas ce que c'est new { this.One } signifie. Et je ne sais pas dans quel cas il pourrait arriver que properties.Length n'est pas égal à 1.

Au fait, je viens de tester pour renommer ma propriété One a Two et Visual Studio est devenu new { this.One } en new { One = this.Two } qui, lorsqu'il est utilisé avec l'option GetName La fonction m'a donné "One" ce qui rend tout cela inutile puisque le nom que je transmettrais à Control.DataBindings.Add serait toujours "Un" après avoir renommé la propriété.

6voto

Botz3000 Points 23640

new { this.One } crée une instance d'un type anonyme avec une propriété, qui est, parce que vous n'avez pas spécifié de nom, appelée "One". C'est pourquoi cela fonctionne.

si vous utilisez new { One = this.Two } vous donnez à la propriété le nom "One". Si vous omettez la partie "Un = ", cela fonctionnera à nouveau.

Cependant, la méthode que vous utilisez peut être mal comprise si l'on ne sait pas comment elle est censée être utilisée et si on ne l'appelle pas en utilisant un type anonyme.

Il existe une autre solution si vous ne souhaitez pas utiliser les chaînes de caractères. Voici l'un des exemples que vous trouverez sur le web :
http://www.codeproject.com/Tips/57234/Getting-Property-Name-using-LINQ.aspx

3voto

jgauffin Points 51913

Non, vous n'êtes pas obligé de vous en tenir aux chaînes de caractères :

public static class ControlBindingsCollectionExtensions
{
   public static void Add<T>(this ControlBindingsCollection instance, Expression<Func<T, object>> property)
    {
        var body = property.Body as UnaryExpression;
        var member = body.Operand as MemberExpression;
        var name = member.Member.Name;
        instance.Add(name);
    }
}

Utilisation :

Control.DataBindings.Add<MyClass>(m => m.MyProperty);

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X