private static void ReInstateField() { NewExpression newAnimal = Expression.New(typeof(Animal)); MemberInfo species = typeof(Animal).GetMember("Species")[0]; MemberInfo age = typeof(Animal).GetMember("Age")[0]; MemberBinding speciesBinding = Expression.Bind(species, Expression.Constant("aabc")); MemberBinding ageBinding = Expression.Bind(age, Expression.Constant(123)); MemberInitExpression initExpression = Expression.MemberInit(newAnimal, speciesBinding, ageBinding); ParameterExpression animalObj = Expression.Variable(typeof(Animal)); BinaryExpression setAnimal = Expression.Assign(animalObj, initExpression); MemberExpression nameExp = Expression.Field(animalObj, "Name"); BinaryExpression binaryFile = Expression.Assign(nameExp, Expression.Constant("abc")); BlockExpression blockExpression1 = Expression.Block(new[] { animalObj }, setAnimal, binaryFile, animalObj); var strExp = initExpression.ToString(); ParameterExpression xP = Expression.Parameter(typeof(Animal), "x"); var exp1 = Expression.Lambda <Func <Animal> >(blockExpression1); var reval = exp1.Compile()(); }
public static void ToStringTest() { MemberInitExpression e1 = Expression.MemberInit(Expression.New(typeof(Y)), Expression.Bind(typeof(Y).GetProperty(nameof(Y.Z)), Expression.Parameter(typeof(int), "z"))); Assert.Equal("new Y() {Z = z}", e1.ToString()); MemberInitExpression e2 = Expression.MemberInit(Expression.New(typeof(Y)), Expression.Bind(typeof(Y).GetProperty(nameof(Y.Z)), Expression.Parameter(typeof(int), "z")), Expression.Bind(typeof(Y).GetProperty(nameof(Y.A)), Expression.Parameter(typeof(int), "a"))); Assert.Equal("new Y() {Z = z, A = a}", e2.ToString()); MemberInitExpression e3 = Expression.MemberInit(Expression.New(typeof(X)), Expression.MemberBind(typeof(X).GetProperty(nameof(X.Y)), Expression.Bind(typeof(Y).GetProperty(nameof(Y.Z)), Expression.Parameter(typeof(int), "z")))); Assert.Equal("new X() {Y = {Z = z}}", e3.ToString()); MemberInitExpression e4 = Expression.MemberInit(Expression.New(typeof(X)), Expression.MemberBind(typeof(X).GetProperty(nameof(X.Y)), Expression.Bind(typeof(Y).GetProperty(nameof(Y.Z)), Expression.Parameter(typeof(int), "z")), Expression.Bind(typeof(Y).GetProperty(nameof(Y.A)), Expression.Parameter(typeof(int), "a")))); Assert.Equal("new X() {Y = {Z = z, A = a}}", e4.ToString()); Reflection.MethodInfo add = typeof(List <int>).GetMethod(nameof(List <int> .Add)); MemberInitExpression e5 = Expression.MemberInit(Expression.New(typeof(X)), Expression.ListBind(typeof(X).GetProperty(nameof(X.XS)), Expression.ElementInit(add, Expression.Parameter(typeof(int), "a")))); Assert.Equal("new X() {XS = {Void Add(Int32)(a)}}", e5.ToString()); MemberInitExpression e6 = Expression.MemberInit(Expression.New(typeof(X)), Expression.ListBind(typeof(X).GetProperty(nameof(X.XS)), Expression.ElementInit(add, Expression.Parameter(typeof(int), "a")), Expression.ElementInit(add, Expression.Parameter(typeof(int), "b")))); Assert.Equal("new X() {XS = {Void Add(Int32)(a), Void Add(Int32)(b)}}", e6.ToString()); }
// // Summary: // Visits the children of the System.Linq.Expressions.MemberInitExpression. // // Parameters: // node: // The expression to visit. // // Returns: // The modified expression, if it or any subexpression was modified; otherwise, // returns the original expression. protected override Expression VisitMemberInit(MemberInitExpression node) { Console.WriteLine("VisitMemberInit:"); Console.WriteLine('\t' + node.GetType().ToString()); Console.WriteLine('\t' + node.ToString()); return(base.VisitMemberInit(node)); }
private static void ReinstatementExpression() { NewExpression newAnimal = Expression.New(typeof(Animal)); MemberExpression nameExp = Expression.Field(newAnimal, "Name"); MemberInfo species = typeof(Animal).GetMember("Species")[0]; MemberInfo age = typeof(Animal).GetMember("Age")[0]; MemberBinding speciesBinding = Expression.Bind(species, Expression.Constant("aaa")); MemberBinding ageBinding = Expression.Bind(age, Expression.Constant(10)); MemberInitExpression initExpression = Expression.MemberInit(newAnimal, speciesBinding, ageBinding); Console.WriteLine(initExpression.ToString()); var exp = Expression.Lambda <Func <Animal> >(initExpression); var a = exp.Compile()(); ParameterExpression xParam = Expression.Parameter(typeof(Animal), "x"); var exp2 = Expression.Lambda <Func <Animal, Animal> >(initExpression, xParam); var nt2 = exp2.NodeType; var nt22 = exp2.Body.NodeType; Console.WriteLine(exp2.ToString()); BlockExpression blockExp = Expression.Block(initExpression); var exp3 = Expression.Lambda <Func <Animal, Animal> >(blockExp, xParam); Console.WriteLine(exp3); var nt3 = exp3.NodeType; var nt33 = exp3.Body.NodeType; var n3 = exp3.Compile()(null); var nodeType = exp.Body.NodeType; Console.WriteLine(nodeType); var aimal = new Animal(); var n1 = aimal.GetName(x => x.Age); object obj = new object(); var path = GetPropertyName <Animal, int>(x => aimal.Age); var path2 = GetPropertyName <Animal, string>(x => aimal.Info.Desc); aimal.GetName(x => x.Species); aimal.GetName(x => x.Age); }
protected virtual Expression VisitMemberInit(MemberInitExpression node) { Console.WriteLine("VisitMemberInit:" + node.ToString()); //foreach (var exp in node.Bindings) //{ // var ma = exp as MemberAssignment; // Expression.Bind(exp.Member, ma.Expression); // this.Visit(ma.Expression); // // this.Visit(exp as MemberInitExpression); // var item = string.Format("[{0}].[{1}] = {2}", ma.Member.ReflectedType.Name, ma.Member.Name, GetValue(ma.Expression).ToString()); // Console.WriteLine("MemberAssignment:" + item); //} return(node); }
private void VisitMemberInit(MemberInitExpression node) { foreach (var memberBinding in node.Bindings) { var memberAssignment = memberBinding as MemberAssignment; if (memberAssignment != null) { _mappings.Add(new ProjectionMemberMapping { Expression = memberAssignment.Expression, Member = memberAssignment.Member }); } else { var message = string.Format("Only member assignments are supported in a new expression in $project and $group, but found {0}.", node.ToString()); throw new NotSupportedException(message); } } VisitNew(node.NewExpression); }
/// <summary>访问子内容为: <see cref="T:System.Linq.Expressions.MemberInitExpression"></see>.</summary> /// <param name="node">被访问的表达式</param> /// <returns>The modified expression, if it or any subexpression was modified; otherwise, returns the original expression.</returns> protected override Expression VisitMemberInit(MemberInitExpression node) { Log(node.ToString()); throw new NotImplementedException(); }
protected virtual T VisitMemberInit(MemberInitExpression exp) { throw new NotImplementedException(exp.ToString()); }
internal override Expression VisitMemberInit(MemberInitExpression init) { if (!ClientTypeUtil.TypeOrElementTypeIsEntity(init.Type)) { throw new NotSupportedException(System.Data.Services.Client.Strings.ALinq_ExpressionNotSupportedInProjectionToEntity(this.type, init.ToString())); } ProjectionAnalyzer.Analyze(init, this.box, this.context); return(init); }
internal override Expression VisitMemberInit(MemberInitExpression init) { if (!ClientTypeUtil.TypeOrElementTypeIsEntity(init.Type)) { // MemberInit to a complex type is not supported on entity types. throw new NotSupportedException(Strings.ALinq_ExpressionNotSupportedInProjectionToEntity(this.type, init.ToString())); } ProjectionAnalyzer.Analyze(init, this.builder, this.context); return(init); }