Comment définir la valeur de propriété en utilisant des expressions?

Étant donné la méthode suivante:

public static void SetPropertyValue(object target, ssortingng propName, object value) { var propInfo = target.GetType().GetProperty(propName, BindingFlags.Instance | BindingFlags.Public | BindingFlags.NonPublic | BindingFlags.DeclaredOnly); if (propInfo == null) throw new ArgumentOutOfRangeException("propName", "Property not found on target"); else propInfo.SetValue(target, value, null); } 

Comment feriez-vous pour écrire son expression activée sans avoir à transmettre un paramètre supplémentaire à la cible?

Pourquoi faire cela au lieu de placer la propriété directement, je peux vous entendre dire. Par exemple, supposons que nous ayons la classe suivante avec une propriété qui a un getter public mais un setter privé:

 public class Customer { public ssortingng Title {get; private set;} public ssortingng Name {get; set;} } 

Je voudrais pouvoir appeler:

 var myCustomerInstance = new Customer(); SetPropertyValue(cust => myCustomerInstance.Title, "Mr"); 

Maintenant, voici un exemple de code.

 public static void SetPropertyValue(Expression<Func> memberLamda , object value) { MemberExpression memberSelectorExpression; var selectorExpression = memberLamda.Body; var castExpression = selectorExpression as UnaryExpression; if (castExpression != null) memberSelectorExpression = castExpression.Operand as MemberExpression; else memberSelectorExpression = memberLamda.Body as MemberExpression; // How do I get the value of myCustomerInstance so that I can invoke SetValue passing it in as a param? Is it possible } 

Des pointeurs?

Vous pouvez sortingcher et rendre la vie plus facile avec une méthode d’extension:

 public static class LambdaExtensions { public static void SetPropertyValue(this T target, Expression> memberLamda, TValue value) { var memberSelectorExpression = memberLamda.Body as MemberExpression; if (memberSelectorExpression != null) { var property = memberSelectorExpression.Member as PropertyInfo; if (property != null) { property.SetValue(target, value, null); } } } } 

et alors:

 var myCustomerInstance = new Customer(); myCustomerInstance.SetPropertyValue(c => c.Title, "Mr"); 

La raison pour laquelle cela est plus facile est que vous avez déjà la cible sur laquelle la méthode d’extension est appelée. De plus, l’expression lambda est une simple expression de membre sans fermeture. Dans votre exemple original, la cible est capturée dans une fermeture et il peut être difficile de se rendre à la cible sous-jacente et à PropertyInfo .