C#学习教程:C#LINQ构建具有匿名类型的表达式我如何修改代码,以便它可以构建具有两个属性“Name”和“Test_Result”的列表我知道可以使用匿名类型来执行此操作,但如何将它们用于动态表达式?这是我的代码:stringitem="Name";stringitem2="Test_Result";输入studentType=typeof(Student);ParameterExpressionitemParam=Expression.Parameter(studentType,item);MemberInfoitemProperty=studentType.GetProperty(item);MemberExpressionvalueInItemField=Expression.MakeMemberAccess(itemParam,itemProperty);表达式selectExpression=Expression.Lambda(valueInItemField,itemParam);IEnumerablecurrentItemFields=DeserializedStudents.Select(selectExpression.IassumeCompile()here)“Name”和“Test_Result”是灵活的,不能硬编码。匿名类型是完全定义的常规类;关于它们的唯一有趣的事情是由编译器而不是你提供的细节。我建议处理这种情况的方法是使用Tuple.Create创建一个IEnumerable>并将它们称为Item1、Item2(来自Tuple的名称。另一种选择是使用类似ExpandoObject的东西,然后使用IDictionaryAPI或动态API来获取值。例如:stringitem1="Name";stringitem2="Test_Result";输入studentType=typeof(Student);varitemParam=Expression.Parameter(studentType,"x");varmember1=Expression.PropertyOrField(itemParam,item1);varmember2=Expression.PropertyOrField(itemParam,item2);varselector=Expression.Call(typeof(Tuple),"Create",new[]{member1.Type,member2.Type},member1,member2);varlambda=Expression.Lambda>>(selector,itemParam);varcurrentItemFields=students.Select(lambda.Compile());这是投射到具有成员名称和结果的自定义类型的相同内容:classProjectedData{publicstringname{get;放;}公共字符串结果{得到;放;}}...字符串item1="姓名";stringitem2="Test_Result";输入studentType=typeof(Student);varitemParam=Expression.Parameter(studentType,"x");varmember1=Expression.PropertyOrField(itemParam,item1);varmember2=Expression.PropertyOrField(itemParam,item2);varselector=Expression.MemberInit(Expression.New(typeof(项目ctedData)),Expression.Bind(typeof(ProjectedData).GetMember("name").Single(),member1),Expression.Bind(typeof(ProjectedData).GetMember("result").Single(),member2));varlambda=Expression.Lambda>(selector,itemParam);varcurrentItemFields=students.Select(lambda.Compile());或者对于一个使用字典的方法:如果对你有用,需要进一步了解C#学习教程,希望你多多关注——string[]fields={"Name","Test_Result"};输入studentType=typeof(Student);varitemParam=Expression.Parameter(studentType,"x");varaddMethod=typeof(Dictionary).GetMethod("Add",new[]{typeof(string),typeof(object)});varselector=Expression.ListInit(Expression.New(typeof(Dictionary)),fields.Select(field=>Expression.ElementInit(addMethod,Expression.Constant(field)),Expression.Convert(Expression.PropertyOrField(itemParam,field),类型(对象)))));varlambda=Expression.Lambda>>(selector,itemParam);varcurrentItemFields=students.Select(lambda.Compile());本文收集自网络,不代表立场。如涉及侵权,请点击右侧联系管理员删除。如有转载请注明出处: