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);

助けてくれてありがとう/答え。

マット

4

2 に答える 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>) は、多くのシナリオで同様に機能する可能性があります。

于 2009-08-24T14:11:20.250 に答える
3

あなたの目標が表現を学ぶことであれば、それで問題ありません。しかし、あなたの目標がこの特定のタスクを達成することである場合、デリゲートはこの問題を解決するためのより適切な方法です。

于 2009-08-24T14:11:51.747 に答える