2009-08-24 9 views
3

私は、C#の表現が現実的に新しいです。ヘルプ/答えをC#、(method?)式を作成してそれを呼び出す

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

ありがとう:私はその

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

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

のようないくつかのクラスの何かを持っている今、私はこのようないくつかのPARAMTER何か(擬似)で、このメソッドの戻り値を呼び出すしたいと思います。

マット

答えて

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

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

+0

これはパフォーマンスのボトルネックかどうか、キャッシュされたコンパイル済みの式を使用するかどうかは、リフレクションよりもはるかに高速です。Invoke() –

関連する問題