Biorąc pod uwagę następujące metody:Jak ustawić wartość właściwości za pomocą wyrażeń?
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);
}
Jak byś go o pisanie to wyrażenie włączona odpowiednik bez konieczności przechodzić na dodatkowym parametrem do celu?
Dlaczego to zamiast ustawiać właściwość bezpośrednio, słyszę, jak mówisz. Na przykład załóżmy, że mamy następujące klasy z nieruchomości, która ma publiczną getter ale prywatny setter:
public class Customer
{
public string Title {get; private set;}
public string Name {get; set;}
}
chciałbym móc zadzwonić:
var myCustomerInstance = new Customer();
SetPropertyValue<Customer>(cust => myCustomerInstance.Title, "Mr");
Teraz Oto przykładowy kod.
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
}
Jakieś wskazówki?
Dlaczego chcesz to zrobić? Jeśli nieruchomość ma prywatnego ustawiacza, to nie powinna być zmieniana z zewnątrz obiektu! Proponowana przez ciebie funkcja łamie semantykę twojego programu. –
@ VladislavZorov Widziałem taki komentarz, a ja podzielam twój pogląd. W tym przypadku DTO strony trzeciej musi zostać przygotowany na test jednostkowy i byłoby to najprostsze podejście. Refleksja ma również swoje zastosowania. – Anastasiosyal
możliwy duplikat [Jak ustawić wartość selektora właściwości Wyrażenie>] (http://stackoverflow.com/questions/8107134/how-set-value-a-property-selector-expressionfunct-tresult) http: // stackoverflow.com/questions/5075484/property-selector-expressionfunct-how-to-get-value-to-selected-property –
nawfal