2013-03-08 30 views
14

Vì vậy, tôi đã chơi với xây dựng động cây biểu hiện gần đây và đi qua phương pháp này, mà dường như kinda lẻ. Lúc đầu, tôi nghĩ "oh mát mẻ này là chính xác những gì tôi cần" sau khi liên tục viết mã dọc theo dòng củaExpression.Bind() - nó thực sự làm gì?

var left = member is FieldInfo ? Expression.Field(instance, (FieldInfo)member) : Expression.Property(instance, (PropertyInfo)member); 
var right = ... 
var assign = Expression.Assign(left, right); 

Vâng, tôi biết có Expression.PropertyOrField() cuộc gọi, nhưng nó khứ hồi trở lại suy nghĩ để tìm thành viên theo tên , như tôi thường đã có ví dụ MemberInfo.

Vì vậy, dù sao, tôi nghĩ Expression.Bind() sẽ hữu ích cho tôi, nhưng nó thực hiện điều mà tôi không thực sự hiểu. Với mã sau:

void Main() 
{ 
    var m = typeof(Foo).GetField("Bar"); 
    Expression.Bind(m, Expression.Constant("")).Dump(); 
} 

public class Foo 
{ 
    public string Bar; 
} 

nó tạo ra MemberAssignment biểu hiện Bar = "". Nhưng không có ví dụ và không có tham chiếu tĩnh. Làm thế nào tôi có thể áp dụng biểu thức này và ví dụ của Foo? Tôi không thể tìm thấy bất kỳ ví dụ nào về phương pháp này đang được sử dụng.

Trả lời

14

Biểu thức đối tượng khởi tạo.

Hãy nói rằng bạn có:

public class Foo 
{ 
    public int Property { get; set; } 
} 

Sau đó, bạn có thể làm:

var parameter = Expression.Parameter(typeof(int), "i"); 
var newExpr = Expression.New(typeof(Foo)); 
var bindExprs = new[] 
    { 
     Expression.Bind(typeof(Foo).GetProperty("Property"), parameter) 
     // You can bind more properties here if you like. 
    }; 

var body = Expression.MemberInit(newExpr, bindExprs); 
var lambda = Expression.Lambda<Func<int, Foo>>(body, parameter); 

mà là một cái gì đó như:

i => new Foo { Property = i } 

Cũ:

tôi có thể' t giúp bạn olve các "vấn đề hiệu suất" bạn được xác định để giải quyết (sẽ sử dụng Expression.PropertyOrField thực sự giới thiệu một nút cổ chai trong ứng dụng của bạn? Tôi hơi hoài nghi. Bạn nên xác định điều này trước khi tối ưu hóa sớm) (EDIT: Xin lỗi vì giả định không chính xác rằng đây là một tối ưu hóa hoàn hảo, và như bạn đã phát hiện ra mình, Expression.MakeMemberAccess là những gì bạn cần), nhưng tôi có thể cho bạn biết những gì Expression.Bind là hữu ích cho.

+2

oooh ... Tôi nghĩ rằng đó là những gì nó được, nhưng tôi đã mong đợi một sự quá tải của 'Expression.New()' để chấp nhận điều đó. Nó không xảy ra với tôi mà có thể là một cuộc gọi hoàn toàn khác. –

+0

Về việc không sử dụng 'PropertyOrField': đó không thực sự là tối ưu hóa. Giống như cho sự tỉnh táo của tôi. –

+0

Ah, nếu là vậy, thì tại sao không viết một người trợ giúp nhỏ có một 'MemberInfo' và các chi nhánh phù hợp? – Ani

Các vấn đề liên quan