Với phương pháp sau đây:Cách đặt giá trị thuộc tính bằng Biểu thức?
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);
}
Làm thế nào bạn sẽ đi về cách viết nó biểu hiện kích hoạt tương đương mà không cần phải vượt qua trong một tham số bổ sung cho mục tiêu?
Tại sao điều này thay vì đặt trực tiếp thuộc tính tôi có thể nghe thấy bạn nói. Ví dụ giả sử chúng ta có lớp sau đây với một tài sản mà có một getter công cộng nhưng setter tin:
public class Customer
{
public string Title {get; private set;}
public string Name {get; set;}
}
Tôi muốn để có thể gọi:
var myCustomerInstance = new Customer();
SetPropertyValue<Customer>(cust => myCustomerInstance.Title, "Mr");
Bây giờ đây là một số mẫu mã.
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
}
Mọi con trỏ?
Tại sao bạn muốn làm điều đó? Nếu tài sản có một setter riêng, sau đó nó không có nghĩa là phải được thay đổi từ bên ngoài đối tượng! Chức năng bạn đang đề xuất sẽ phá vỡ ngữ nghĩa của chương trình của bạn. –
@VladislavZorov Tôi có thể thấy một bình luận sắp tới và tôi chia sẻ quan điểm của bạn. Trong trường hợp này, DTO của bên thứ ba cần phải được thử nghiệm trong đơn vị và đây sẽ là cách tiếp cận đơn giản nhất để thực hiện điều đó. Phản ánh cũng có sử dụng của nó. – Anastasiosyal
bản sao có thể có của [Cách đặt giá trị bộ chọn thuộc tính Biểu thức>] (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