방프리

24.04.30 Chapter5. 동적 프로그래밍 (Item 46) 본문

C#/More Effective C#

24.04.30 Chapter5. 동적 프로그래밍 (Item 46)

방프리 2024. 4. 30. 21:10

Item 46 : 표현식 API의 사용법을 익혀두라

C#에 LINQ와 동적 지원 기능이 추가되면서 표현식과 표현식 트리를 사용해 동적 프로그래밍이 가능하다.
표현식은 코드처럼 보이며 많은 경우 델리게이트로 컴파일하여 사용한다.
표현식을 사용하게되면 여러 제약조건으로 메서드를 사용할 때 코드량을 줄이면서 유연하게 사용이 가능하다.

public TResult CallInterface<TResult>(Expression<Func<T, TResult>> op)
{
    var exp = op.Body as MethodCallExpression;
    var methodName = exp.Method.Name;
    var methodInfo = exp.Method;
    var allParameters = from element in exp.Arguments
                        select processArgument(element);
    Console.WriteLine($"Calling {methodName}");
    
    foreach (var param in allParameters)
        Console.WriteLine(@$"\tParameter type = {param.ParmType}, Value = {param.ParmType}");
    return default(TResult);
}

private (Type parmType, object ParmValue) processArgument(Expression element)
{
    object argument = default(object);
    LambdaExpression expression = Expression.Lambda(
        Expression.Convert(element, element.Type));
    Type parmType = expression.ReturnType;
    argument = expression.Compile().DynamicInvoke();
    
    return (parmType, argument);
}

//사용 시
var client = new ClientProxy<IService>();
var result = client.CallInterface<string>(server => server.DoWork(172));

 

Comments