2009-08-13 17 views
6

jako podmiot, jak połączyć dwa wyrażenia w jeden dla tego przypadku:Jak połączyć dwa wyrażenia: result = exp1 (exp2);

Expression<Func<IEnumerable<T>, IEnumerable<T>>> exp1; 
Expression<Func<IEnumerable<T>, IEnumerable<T>>> exp2; 

Expression<Func<IEnumerable<T>, IEnumerable<T>>> result = ???; // exp1(exp2) 

Odpowiedz

8

Jest to naprawdę tylko szczególną formą łączenia dwóch Expression<Func<T, T>> wartości. Oto przykład, że robi:

using System; 
using System.Linq.Expressions; 

public class Test 
{ 
    public static Expression<Func<T, T>> Apply<T> 
     (Expression<Func<T, T>> first, Expression<Func<T, T>> second) 
    { 
     ParameterExpression input = Expression.Parameter(typeof(T), "input"); 
     Expression invokedSecond = Expression.Invoke(second, 
                new Expression[]{input}); 
     Expression invokedFirst = Expression.Invoke(first, 
                new[]{invokedSecond}); 
     return Expression.Lambda<Func<T, T>>(invokedFirst, new[]{input}); 
    } 

    static void Main() 
    { 
     var addAndSquare = Apply<int>(x => x + 1, 
             x => x * x); 

     Console.WriteLine(addAndSquare.Compile()(5)); 
    } 
} 

można napisać ApplySequence w tych warunkach łatwo, jeśli chcesz:

public static Expression<Func<IEnumerable<T>, IEnumerable<T>>> 
     ApplySequence<T> 
      (Expression<Func<IEnumerable<T>, IEnumerable<T>>> first, 
      Expression<Func<IEnumerable<T>, IEnumerable<T>>> second) 
    { 
     return Apply(first, second); 
    } 
+0

Co to jest "nowe [] {invokedSecond}" oznaczają? Czy tworzy tablicę typu invokedSecond? Lub tablica obiektów z pojedynczą pozycją wywołanąSecond? – Kamarey

+0

Jest to niejawnie wpisana tablica, wpisywana zgodnie ze statycznymi typami elementów - w tym przypadku jest to odpowiednik 'new Express [] {invokedSecond}'. –