2009-09-13 2 views
3

사용자가 입력 한 부울 식을 동적으로 계산할 수 있도록 .NET 3.5에서 Expression 트리와 Lamdba Expression 개체를 사용하려고합니다.많은 매개 변수가있는 표현식 트리 계산

지금까지 사용자는 BinarayExpressions의 AND 및 OR 값이 ParameterExpressions으로 표현 된 표현 트리를 만들 수 있습니다. 그런 다음 해당 트리를 기반으로 LambdaExpression을 작성하여 표현식을 작성하여 위임자가 호출 할 수 있도록 할 계획이었습니다. 내가 겪고있는 문제는 사용자가 필요로하는 입력 매개 변수의 수를 모를 경우 대리자로 표현식을 컴파일 할 때 메소드 서명이 런타임까지 어떻게되어야하는지 모르기 때문입니다.

지금까지 두 가지 가능한 해결책을 생각해 냈습니다.

  1. 내가 사용자가 가능해야합니다 생각하는 많은 매개 변수를 취할 수있는 Func<bool, bool, bool...> 것과 같은 대표 의 전체 무리를 만듭니다. 이것은 가장 우아한 해결책처럼 느껴지지 않지만 누군가가 내가 음식을 장만했던 것보다 하나 더 많은 매개 변수를 사용하기를 원할 때까지는 효과가있을 것이라고 생각합니다.
  2. 값 배열을 전달하고 배열 인덱서를 사용하여 매개 변수에 할당합니다. 나는 이것에 대해 생각해 보았지만 어떻게 작동하는지 알 수 없었다.

NB : 그렇게 빨리 복싱이나 그렇게 할 필요가 없습니다.

답변

3

배열 접근법 (Finguistics의 경우 발생)을 사용하여 이전에 정확히을 수행했습니다. 트릭은 Expression.ArrayIndex이다.

var arr = Expression.Parameter(typeof(int[]), "arr"); 
    var body = Expression.ArrayIndex(arr, Expression.Constant(1)); 
    var expr = Expression.Lambda<Func<int[], int>>(body, arr); 
    var func = expr.Compile(); 

    int[] vals = { 7, 8, 9 }; 
    int i = func(vals); 
배열 방식의 장점은 당신이 강력한 형식의 대리자 형식 (인수 Func<int[],int> 또는 유사한 상관없이 수를 유지하고 Invoke를 입력 할 수 있다는 것입니다

DynamicInvoke보다 훨씬 빠른

.

값이 모두 같은 유형이 아닌 경우에도 수행 할 수 있습니다. 알려 주시면 예제를 추가하겠습니다.

+0

감사합니다. Marc. 유형이 같지 않습니다. 다음 요구 사항이 될 것으로 예상됩니다. 또한 관심이 있습니다. 그 일이 어떻게 이루어 졌는지 알기. –