Expression to create an instance with object initializer

后端 未结 2 1407
闹比i
闹比i 2020-12-25 15:09

Is there any way to create an instance of an object with object initializer with an Expression Tree? I mean create an Expression Tree to build this lambda:

/         


        
2条回答
  •  遥遥无期
    2020-12-25 15:16

    Finally I found my answer:

    public static Func Creator; 
    
    static void BuildLambda() { 
        var expectedType = typeof(MyObject); 
        var displayValueParam = Expression.Parameter(typeof(bool), "displayValue"); 
        var ctor = Expression.New(expectedType); 
        var local = Expression.Parameter(expectedType, "obj"); 
        var displayValueProperty = Expression.Property(local, "DisplayValue"); 
    
        var returnTarget = Expression.Label(expectedType); 
        var returnExpression = Expression.Return(returnTarget,local, expectedType); 
        var returnLabel = Expression.Label(returnTarget, Expression.Default(expectedType)); 
    
        var block = Expression.Block( 
            new[] { local }, 
            Expression.Assign(local, ctor), 
            Expression.Assign(displayValueProperty, displayValueParam), 
            /* I forgot to remove this line:
             * Expression.Return(Expression.Label(expectedType), local, expectedType), 
             * and now it works.
             * */
            returnExpression, 
            returnLabel 
            ); 
        Creator = 
            Expression.Lambda>(block, displayValueParam) 
                .Compile(); 
    }
    

    UPDATE:

    While it works fine, but @svick provide a better and shorter way in his answer that is actuallt wath I was looking for: MemberInit. Please see @svick's answer.

提交回复
热议问题