Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/281.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C#,创建(方法?)表达式并调用它_C#_Expression - Fatal编程技术网

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

C#,创建(方法?)表达式并调用它,c#,expression,C#,Expression,我对c#expression还不太熟悉。我上过类似的课 class SimpleClass { private string ReturnString(string InputString) { return "result is: "+InputString; } public string Return(Expression exp) { LambdaExpression lambda = Expression.Lam

我对c#expression还不太熟悉。我上过类似的课

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);
谢谢你的帮助/回答


Matt

最好尽早执行
exp
签名-即作为
表达式

或:

SimpleClass sc=newsimpleclass();
Expression=Expression.Call(
Expression.Constant(sc),//目标对象
“ReturnString”,//方法名称
null,//泛型类型参数
Expression.Constant(“hello world”)//方法参数
);
var lambda=Expression.lambda(表达式);
字符串结果=sc.Return(lambda);
控制台写入线(结果);

当然,委托用法(
Func
)在许多情况下都可能同样有效。

如果您的目标是学习表达式,那就好了。但是,如果您的目标是完成这项特定任务,那么a将是解决此问题的更合适的方法。

这取决于这是否是性能瓶颈,使用缓存的编译表达式比反射调用()快得多
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);