Dado el siguiente método:¿Cómo establecer el valor de propiedad usando Expresiones?
public static void SetPropertyValue(object target, string 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);
}
Cómo haría usted para escribir está habilitado expresión equivalente, sin necesidad de pasar de un parámetro adicional para el objetivo?
¿Por qué hacer esto en vez de establecer la propiedad directamente? Puedo oírte decir. Por ejemplo supongamos que tenemos la siguiente clase con una propiedad que tiene un captador público, pero colocador privada:
public class Customer
{
public string Title {get; private set;}
public string Name {get; set;}
}
Me gustaría ser capaz de llamar a:
var myCustomerInstance = new Customer();
SetPropertyValue<Customer>(cust => myCustomerInstance.Title, "Mr");
Ahora aquí es un código de ejemplo.
public static void SetPropertyValue<T>(Expression<Func<T, Object>> 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
}
¿Alguna sugerencia?
¿Por qué querrías hacer eso? Si la propiedad tiene un setter privado, ¡no debe cambiarse desde fuera del objeto! La función que está proponiendo rompe la semántica de su programa. –
@VladislavZorov Pude ver un comentario así y comparto tu opinión. En este caso, un DTO de un tercero debe prepararse en una prueba unitaria y este sería el enfoque más simple para hacerlo. La reflexión también tiene sus usos. – Anastasiosyal
posible duplicado de [Cómo establecer el valor de un selector de propiedad Expresión>] (http://stackoverflow.com/questions/8107134/how-set-value-a-property-selector-expressionfunct-tresult) http: // stackoverflow.com/questions/5075484/property-selector-expressionfunct-how-to-get-set-value-to-selected-property –
nawfal