C#,创建(方法?)表达式并调用它。

3

我相对较新于C#表达式。我有一些类似这样的类

class SimpleClass
{
    private string ReturnString(string InputString)
    {
        return "result is: "+InputString;
    }

    public string Return(Expression exp)
    {
        LambdaExpression lambda = Expression.Lambda(exp);
        return lambda.Compile();
    }
}

现在,我想用一些参数来调用这个方法Return,类似于以下伪代码:

      SimpleClass sc = new SimpleClass();
      Expression expression = Expression.MethodCall(//how to create expression to call SimpleClass.ReturnString with some parameter?);
     string result = sc.Return(expression);
    Console.WriteLine(result);

感谢您的帮助/回答。
马特
2个回答

6

尽早强制实施 exp 签名更好-即作为 Expression<Func<string>>

public string Return(Expression<Func<string>> expression)
{
    return expression.Compile()();
}

可以使用以下任一方式:

SimpleClass sc = new SimpleClass();
string result = sc.Return(() => sc.ReturnString("hello world"));
Console.WriteLine(result);

或者:

SimpleClass sc = new SimpleClass();
Expression expression = Expression.Call(
    Expression.Constant(sc),           // target-object
    "ReturnString",                    // method-name
    null,                              // generic type-argments
    Expression.Constant("hello world") // method-arguments
);
var lambda = Expression.Lambda<Func<string>>(expression);
string result = sc.Return(lambda);
Console.WriteLine(result);

当然,在许多情况下,代理使用(Func<string>)可能同样有效。

3

如果你的目标是学习表达式,那很好。但如果你的目标是完成这个特定任务,那么使用委托会是解决这个问题更合适的方式。


这取决于是否存在性能瓶颈,使用缓存编译的表达式比反射调用(Invoke())要快得多。 - Rhys Bevilaqua

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接