2009-08-24 6 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(); 
    } 
} 

같은 몇 가지 클래스 뭔가가있다.

매트

답변

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)보다 훨씬 빠릅니다. –

관련 문제