Я знаю, что это старая тема, но здесь есть еще один способ сделать это. Это имеет преимущество в том, что значительно быстрее, если вам нужно сделать это в цикле. Я преобразовал результат из "func" в объект, чтобы сделать его более универсальным.
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);
В исходном вопросе код использовался внутри linq, поэтому скорость могла быть хорошей. Было бы возможно использовать "func" direct в предложении where, если бы он был построен правильно, например,
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();