2009-08-24 5 views
3

Je suis vraiment novice en expression C#. J'ai quelque chose de classe comme çaC#, créez une expression (méthode?) Et appelez-la

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

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

Maintenant, je voudrais appeler cette méthode Retour avec quelque chose de paramter (pseudo) comme ceci:

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

Merci pour l'aide/réponse.

Matt

Répondre

6

Il serait préférable de faire respecter la signature exp le plus tôt possible - à savoir comme Expression<Func<string>>

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

soit:

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

ou:

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

Bien sûr, l'utilisation déléguée (Func<string>) peut fonctionner aussi bien dans de nombreux scénarios.

3

Si votre objectif est d'apprendre des expressions, c'est bien. Mais si votre objectif est d'accomplir cette tâche particulière, alors un delegate serait un moyen plus approprié pour résoudre ce problème.

+0

Cela dépend si cela était un goulot d'étranglement des performances, en utilisant une expression compilée en cache est beaucoup plus rapide que la réflexion Invoke() –

Questions connexes