C# 从数组字符串生成匿名类型

C# Build anonymous type from array string

提问人:Phil 提问时间:4/4/2023 最后编辑:CharliefacePhil 更新时间:4/4/2023 访问量:94

问:

我正在寻找一种方法来从对象构建匿名类型,其中它的属性名称与给定字符串数组中的属性名称匹配。像这样:

//Current Way:
    var anonObject = primaryObject.Select(m=> new {m.property1, m.property2, m.property3, m.property4, ...etc});
//Ideal Way:
    var propertyArray= new string["property1","property3"];
    var anonObject = primaryObject.Select(m=> new { /* Something here where we step through primaryObject.GetProperties() and only choose the ones where the name is contained in the above array */ });

关于如何实现这一目标的任何想法?

C# 反射 自动映射器 System.Reflection 匿名类型

评论

6赞 Jeroen Mostert 4/4/2023
匿名类型仍然是静态类型的。你所追求的内容不会是静态类型的,所以它不能是匿名类型。合乎逻辑的选择是 a(或者比它不是同构的更具体),或者如果你必须与需要对象的东西进行交互,则 .或者,如果字符串数组可以变化,但在运行时不会变化,则可以考虑代码生成(如源代码生成器)以在编译时创建所需的类型。还有各种动态 LINQ 库,但我没有使用这些库的经验。Dictionary<string, object>objectExpandoObject
0赞 D Stanley 4/4/2023
您打算如何使用在编译时属性未知的匿名类型?意思是,你如何处理那个匿名类型的对象?我强烈怀疑有一种不同的方法可以在不使用“动态”匿名类型的情况下做你想做的事情。
1赞 Jeroen Mostert 4/4/2023
然后听起来你更追求像 AutoMapper 这样的东西,与 LINQ 没有太大关系。
1赞 Jeroen Mostert 4/4/2023
你本身不需要 AutoMapper——你可以自己使用,但编写这样的反射代码从来都不舒服,而且通常性能会比专门的解决方案差。Type.GetProperties()PropertyInfo.GetValue()/SetValue()
4赞 Jeroen Mostert 4/4/2023
同样:你不能构建一个匿名类型,因为它的结构在编译时必须是已知的,而数组的内容编译时是未知的(或者,即使知道,该知识也不能用于声明类型)。匿名类型只是隐式声明的类的简写,您没有给出名称,但它们在其他方面的工作方式与普通类完全相同。您可以做的是分配“另一个对象”的属性,您所说的属性列表实际上来自该对象,使用该对象属性的简单循环。foreach

答: 暂无答案