Calling a Generic Method using Lambda Expressions (and a Type only known at runtime)

前端 未结 2 638
我在风中等你
我在风中等你 2020-12-10 12:06

You can use Lambda Expression Objects to represent a lambda as an expression.

How do you create a Lambda Expression Object representing a generic method call, if yo

相关标签:
2条回答
  • 2020-12-10 12:24
    static Expression<Func<IEnumerable<T>, T>> CreateLambda<T>()
    {
        var source = Expression.Parameter(
            typeof(IEnumerable<T>), "source");
    
        var call = Expression.Call(
            typeof(Enumerable), "Last", new Type[] { typeof(T) }, source);
    
        return Expression.Lambda<Func<IEnumerable<T>, T>>(call, source)
    }
    

    or

    static LambdaExpression CreateLambda(Type type)
    {
        var source = Expression.Parameter(
            typeof(IEnumerable<>).MakeGenericType(type), "source");
    
        var call = Expression.Call(
            typeof(Enumerable), "Last", new Type[] { type }, source);
    
        return Expression.Lambda(call, source)
    }
    
    0 讨论(0)
  • 2020-12-10 12:31

    I don't fully understand the question, but the code that dtb wrote could be written simply as:

    class MyUtils {
      public static Expression<Func<IEnumerable<T>, T>> CreateLambda<T>() { 
        return source => source.Last();
      }
    }
    

    The code in the sample by dtb is pretty much the same thing as what the C# compiler automatically generates for you from this lambda expression (compiled as expression tree, because the return type is Expression).

    If you know the type at runtime, then you can either use the solution by dtb or you can invoke the CreateLambda method (above) using Reflection, which may be slower, but allows you to write the code in the lambda in the natural C#:

    var createMeth = typeof(MyUtils).GetMethod("CreateLambda");
    LambdaExpression l = createMeth.MakeGenericMethod(yourType).Invoke();
    

    The nice thing about this approach is that the code in CreateLambda can be much more complicated, which would be really hard to do using expression trees explicitly.

    0 讨论(0)
提交回复
热议问题