Expression pour définir les propriétés sur une instance d'objet existante

c# expression-trees lambda linq

Question

Comment utiliser Expression pour définir les propriétés d'une instance d'objet que j'ai déjà? Je ne veux pas créer un nouvel objet, donc Expression.New où vous pouvez passer les initialiseurs de membres ne fonctionnera pas

Ce n'est pas une copie de Comment définir la valeur d'une propriété à l'aide d'Expressions? car cela prend une Expression et définit les propriétés via Reflection .

J'ai un object existant et je veux créer une Expression laquelle je peux définir des propriétés. Cette expression sera ensuite compilée dans un delegate à exécuter.

Réponse acceptée

qu'en est-il de:

public class User {
    public string Name {get;set;}
}

public static void Main()
{
    var user = new User();
    var assigner = GetAssigner<User, string>(u => u.Name);
    assigner.Compile()(user, "Joe");
    Console.WriteLine(user.Name);
}

public static Expression<Action<TClass, TValue>> GetAssigner<TClass, TValue>(Expression<Func<TClass, TValue>> propertyAccessor){
    var prop = ((MemberExpression)propertyAccessor.Body).Member;
    var typeParam = Expression.Parameter(typeof(TClass));
    var valueParam = Expression.Parameter(typeof(TValue));
    return Expression.Lambda<Action<TClass, TValue>>(
        Expression.Assign(
            Expression.MakeMemberAccess(typeParam, prop),
            valueParam), typeParam, valueParam);

}

Rappelez-vous que l’expression n’est qu’une définition de ce qui doit être fait, vous devez la compiler pour un délégué afin de pouvoir l’appeler.


Réponse populaire

Avez-vous envisagé d'utiliser MemberAssignment pour définir la valeur du ou des membres?

Représente l'opération d'attribution d'un champ ou de la propriété d'un objet.

Remarque importante dans les remarques, cependant: vous ne pouvez pas les créer directement. Au lieu,

Utilisez les méthodes d'usine Bind pour créer un MemberAssignment. MemberAssignment a la propriété BindingType égale à Assignment .




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