Expression.Bind () - que fait-il réellement?

.net c# expression expression-trees reflection

Question

J'ai donc récemment joué avec la construction dynamique d'arbres d'expression et suis tombé sur cette méthode, qui semble plutôt étrange. Au début, je pensais "oh cool c'est exactement ce dont j'ai besoin" après avoir constamment écrit du code dans le sens de

var left = member is FieldInfo ? Expression.Field(instance, (FieldInfo)member) : Expression.Property(instance, (PropertyInfo)member);
var right = ...
var assign = Expression.Assign(left, right);

Oui, je sais qu’il existe un appel à Expression.PropertyOrField() , mais il revient en arrière à la réflexion pour rechercher le membre par son nom, où j’ai déjà généralement une instance MemberInfo .

Donc de toute façon, je pensais que Expression.Bind() me serait utile, mais cela fait quelque chose que je ne comprends pas vraiment. Étant donné le code suivant:

var left = member is FieldInfo ? Expression.Field(instance, (FieldInfo)member) : Expression.Property(instance, (PropertyInfo)member);
var right = ...
var assign = Expression.Assign(left, right);

il génère MemberAssignment expression MemberAssignment Bar = "" . Mais il n'y a pas d'instance et pas de référence statique. Comment pourrais-je jamais appliquer cette expression et cette instance de Foo ? Je ne trouve aucun exemple d'utilisation de cette méthode.

Réponse acceptée

Expressions d'initialisation d'objet .

Disons que vous avez eu:

public class Foo
{
    public int Property { get; set; }
}

Ensuite, vous pourriez faire:

public class Foo
{
    public int Property { get; set; }
}

qui est quelque chose comme:

public class Foo
{
    public int Property { get; set; }
}

Vieux:

Je ne peux pas vous aider à résoudre le « problème de performance » vous êtes déterminé à résoudre (EDIT (va introduire à l' aide Expression.PropertyOrField vraiment un goulot d' étranglement dans votre application , je suis un peu sceptique Vous devez déterminer ce avant d' optimiser prématurément?.): Toutes mes excuses pour supposant à tort qu’il s’agissait d’une optimisation optimale et, comme vous l’avez découvert vous-même, Expression.MakeMemberAccess est ce dont vous avez besoin), mais je peux vous dire à quoi sert Expression.Bind .




Sous licence: CC-BY-SA with attribution
Non affilié à Stack Overflow
Est-ce KB légal? Oui, apprenez pourquoi
Sous licence: CC-BY-SA with attribution
Non affilié à Stack Overflow
Est-ce KB légal? Oui, apprenez pourquoi