Nó là tương đối dễ dàng để tạo một hàm lambda mà sẽ trả về giá trị của một tài sản từ một đối tượng, thậm chí bao gồm cả tài sản sâu ...Tạo hành động lambda từ biểu hiện chức năng
Func<Category, string> getCategoryName = new Func<Category, string>(c => c.Name);
và điều này có thể được gọi là sau ...
string categoryName = getCategoryName(this.category);
Nhưng, cho chỉ chức năng kết quả trên (hoặc các biểu hiện ban đầu được dùng để tạo ra các chức năng), ai cũng có thể cung cấp một cách dễ dàng để tạo ra các hành động đối lập ...
Action<Category, string> setCategoryName = new Action<Category, string>((c, s) => c.Name = s);
... mà sẽ cho phép giá trị tài sản tương tự được thiết lập như sau?
setCategoryName(this.category, "");
Lưu ý rằng tôi đang tìm cách tạo hành động theo chương trình từ hàm hoặc biểu thức - Tôi hy vọng rằng tôi đã chỉ ra rằng tôi đã biết cách tạo thủ công.
Tôi mở cửa cho các câu trả lời hoạt động ở cả hai .net 3.5 và 4.0.
Cảm ơn.
UPDATE:
Có lẽ tôi không được rõ ràng trong câu hỏi của tôi, vì vậy hãy để tôi cố gắng và chứng minh rõ ràng hơn những gì tôi đang cố gắng làm.
tôi có phương pháp sau đây (mà tôi đã tạo ra cho mục đích của câu hỏi này) ...
void DoLambdaStuff<TObject, TValue>(TObject obj, Expression<Func<TObject, TValue>> expression) {
Func<TObject, TValue> getValue = expression.Compile();
TValue stuff = getValue(obj);
Expression<Action<TObject, TValue>> assignmentExpression = (o, v) => Expression<TObject>.Assign(expression, Expression.Constant(v, typeof(TValue)));
Action<TObject, TValue> setValue = assignmentExpression.Compile();
setValue(obj, stuff);
}
Những gì tôi đang tìm kiếm là làm thế nào để tạo ra "assignmentExpression" trong mã để Tôi có thể biên dịch nó thành setValue? Tôi hình nó có liên quan đến Expression.Assign, nhưng tôi chỉ đơn giản là không thể làm việc ra sự kết hợp chính xác của các tham số để hoàn thành mã.
Kết quả cuối cùng là để có thể gọi
Category category = *<get object from somewhere>*;
this.DoLambdaStuff(category, c => c.Name);
và điều này đến lượt nó sẽ tạo ra một phương thức getter và setter cho "Tên" tài sản của đối tượng loại.
Phiên bản ở trên biên dịch, nhưng khi tôi gọi setValue(), kết quả là một ArgumentException với "Biểu thức phải có khả năng ghi".
Xin cảm ơn một lần nữa.
Tôi không thực sự hiểu những gì bạn có nghĩa là bằng cách làm nó tự động chứ không phải bằng tay. Tuy nhiên, nếu bạn muốn thiết lập các thuộc tính và quyết định thuộc tính nào bạn muốn đặt trong thời gian chạy, bạn nên sử dụng sự phản chiếu. Hơn nữa, bạn có thể sử dụng cây biểu thức để xây dựng các biểu thức lambda thời gian chạy. – Henri