我有一個用於生成NewExpression
。
public NewExpression CreateNewExpression( Expression<Func<T>> expression )
{
return expression.Body as NewExpression;
}
然後你可以做這樣的事情。
CreateNewExpression( () => new MyType() );
這稍後用於創建可以執行以創建對象的委託。
var body = Expression.MemberInit( constructorExpression, bindings );
var funcType = typeof( Func<> ).MakeGenericType( objectType );
var lambda = Expression.Lambda( funcType, body ).Compile();
這很好用,但現在我想將一些數據傳遞給方法,以便它可以用於構造對象。
public NewExpression CreateNewExpression( Expression<Func<T, Data>> expression )
然後將這樣使用。
CreateNewExpression( data => new MyType( data.Id ) );
我不能為我的生活弄清楚如何創建正確的表達式來傳遞數據以供構造函數使用。
如果我不從CreateNewExpression中的表達式中提取body並執行Expression.Invoke
,我不知道如何在之後設置屬性。
如果我提取正文,我可以使用Expression.MemberInit
設置屬性,但後來我無法弄清楚如何將數據傳遞給它。
我怎樣才能做到這一點?
如果要使用包含ParameterExpression
的表達式,則還需要在最終表達式中重用相同的ParameterExpression
。
為此,您可以訪問原始表達式的Parameters
,然後將參數傳遞給Expression.Lambda()
。結果可能如下所示:
public Delegate M<T>(Expression<Func<Data, T>> expression)
{
var objectType = typeof(T);
var constructorExpression = (NewExpression)expression.Body;
var constructorParameterExpression = expression.Parameters.Single();
var bindings = …;
var body = Expression.MemberInit( constructorExpression, bindings );
var funcType = typeof( Func<,> ).MakeGenericType( typeof(Data), objectType );
var lambda = Expression.Lambda( funcType, body, constructorParameterExpression )
.Compile();
return lambda;
}