如何使用反射在运行时生成此 C# "Expression"?



直到今天,我还没有找到一篇关于表达式的好文章——以及如何看待c# lambda语句并说"哦,这是一个废话"……所以,如果你知道一篇好文章,我也会很感激的。

解释问题的代码示例

所以…给定以下c#代码:

public class SomeClass<T>
{
    public TResult SomeMethod<TResult>(Expression<Func<T, TResult>> expression)
    {
        // This is just an example... don't get hung up on this :)
        return default(TResult);
    }
}
public class Person
{
    public string FirstName { get; set; }
    public string LastName { get; set; }
}

我该怎么做?

var blah = new SomeClass<Person>();
blah.SomeMethod(p => p.FirstName);

在运行时(使用反射)?

我期待的答案

我有点期待这样的事情…但我肯定我对表达方式的选择错了。

// By the way, these values are being passed to me... so you
// can't change this part of the question :)
Type personType = typeof(Person);
string propertyName = "FirstName";
// THIS CODE BELOW IS OBVIOUSLY WRONG, BUT YOU GET THE IDEA OF
// WHAT I HOPE TO DO... THIS LINE OF CODE BELOW IS **ALL** I'M
// ASKING HOW TO DO :)
var expression = Expression.MakeUnary(ExpressionType.Lambda,
    Expression.Property(Expression.Parameter(personType, "p"),
    propertyName), typeof(string));
blah.SomeMethod(expression);

试试这个:

var functorParam = Expression.Parameter(typeof(Person));
var lambda = Expression.Lambda(
    Expression.Property(functorParam, typeof(Person).GetProperty("FirstName"))
,   functorParam /* <<= EDIT #1 */
);
blah.SomeMethod((Expression<Func<Person,string>>)lambda); /* EDIT #2 */

ExpressionBuilder是可行的。

相关内容

  • 没有找到相关文章

最新更新