I have the following Expression:
.Call System.Linq.Queryable.Select(
.Constant<System.Linq.EnumerableQuery`1[System.Linq.Dynamic.Tests.Helpers.User]>(System.Linq.Dynamic.Tests.Helpers.User[]),
'(.Lambda #Lambda1<System.Func`2[System.Linq.Dynamic.Tests.Helpers.User,System.Linq.Dynamic.DynamicObjectClass]>))
.Lambda #Lambda1<System.Func`2[System.Linq.Dynamic.Tests.Helpers.User,System.Linq.Dynamic.DynamicObjectClass]>(System.Linq.Dynamic.Tests.Helpers.User $var1)
{
.New System.Linq.Dynamic.DynamicObjectClass(
.New System.Collections.Generic.KeyValuePair`2[System.String, System.Object](
"UserName",
(System.Object)$var1.UserName),
.New System.Collections.Generic.KeyValuePair`2[System.String, System.Object](
"MyFirstName",
(System.Object)($var1.Profile).FirstName))
}
and want to rewrite it to the following:
.Call System.Linq.Queryable.Select(
.Constant<System.Linq.EnumerableQuery`1[System.Linq.Dynamic.Tests.Helpers.User]>(System.Linq.Dynamic.Tests.Helpers.User[]),
'(.Lambda #Lambda1<System.Func`2[System.Linq.Dynamic.Tests.Helpers.User,DynamicClass1]>))
.Lambda #Lambda1<System.Func`2[System.Linq.Dynamic.Tests.Helpers.User,DynamicClass1]>(System.Linq.Dynamic.Tests.Helpers.User $var1)
{
.New DynamicClass1()
{
UserName = $var1.UserName,
MyFirstName = ($var1.Profile).FirstName
}
}
I tried with the Expression Visitor and following Code:
protected override Expression VisitNew(NewExpression node)
{
if (node.Type == typeof(DynamicObjectClass))
{
var properties = new List<DynamicProperty>(node.Arguments.Count);
var expressions = new List<Expression>(node.Arguments.Count);
foreach (NewExpression newEx in node.Arguments)
{
var name = ((ConstantExpression)newEx.Arguments.First()).Value as string;
var parameter = ((UnaryExpression)newEx.Arguments.Skip(1).First()).Operand;
properties.Add(new DynamicProperty(name, parameter.Type));
expressions.Add(parameter);
}
Type type = DynamicExpression.CreateClass(properties);
MemberBinding[] bindings = new MemberBinding[properties.Count];
for (int i = 0; i < bindings.Length; i++)
bindings[i] = Expression.Bind(type.GetProperty(properties[i].Name), expressions[i]);
return Expression.MemberInit(Expression.New(type), bindings);
}
return base.VisitNew(node);
}
but I got this Exception:
A first chance exception of type 'System.ArgumentException' occurred in System.Core.dll
Additional Informations: Expression of type 'DynamicClass1' cannot be used for return type 'System.Linq.Dynamic.DynamicObjectClass'
I think I need to overwrite VisitLambda, but I have no exact Idea! Can anyone help me out?
With this Code it now works at the moment (but I don't think it works for all cases...)