Tôi biết đây là một chủ đề cũ nhưng đây là một cách khác để làm điều đó. Điều này có lợi thế là nhanh hơn đáng kể nếu bạn cần làm điều đó trong một vòng lặp. Tôi đã chuyển đổi kết quả ra khỏi "func" thành đối tượng để làm cho nó có mục đích chung hơn một chút.
var p = Expression.Parameter(typeof(string));
var prop = Expression.Property(p, "Length");
var con = Expression.Convert(prop, typeof(object));
var exp = Expression.Lambda(con, p);
var func = (Func<string, object>)exp.Compile();
var obj = "ABC";
int len = (int)func(obj);
Trong câu hỏi ban đầu, mã được sử dụng bên trong LINQ nên tốc độ có thể tốt.Có thể sử dụng "func" trực tiếp trong mệnh đề where cũng nếu nó được xây dựng chính xác, ví dụ:
class ABC
{
public string Name { get; set; }
}
var p = Expression.Parameter(typeof(ABC));
var prop = Expression.Property(p, "Name");
var body = Expression.Equal(prop, Expression.Constant("Bob"));
var exp = Expression.Lambda(body, p);
var func = (Func<ABC, bool>)exp.Compile();
ABC[] items = "Fred,Bob,Mary,Jane,Bob".Split(',').Select(s => new ABC() { Name = s }).ToArray();
ABC[] bobs = items.Where(func).ToArray();
Đã yêu thích nó! Cảm ơn bạn. – Dementic