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.
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. –
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. –
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