我有一个简单的List
,其中每一行都有 50列。我想要返回所有50列 + 3个自定义列但我想让列表的每一行都像一个扁平(非嵌套)对象。< / p>
示例:
var newList = list.Select(x => new
{ x,
d.CustomColA = x.ColA+10,
d.CustomColB = x.ColB+30,
d.CustomColC = x.ColC+50
});
结果:效果很好但每个结果行都像一个嵌套对象:
var row = newList.FirstOrDefault();
row.x.ColA
row.x.ColB
row.x.ColC
.....
row.CustomColA
row.CustomColB
row.CustomColB
预期结果:
var row = newList.FirstOrDefault();
row.ColA
row.ColB
row.ColC
.....
row.CustomColA
row.CustomColB
row.CustomColB
我使用dynamic
类型并编写了以下代码,但它没有返回预期的结果:
var newList = list.Select(x =>
{
dynamic d = x;
d.CustomColA = x.ColA+10;
d.CustomColB = x.ColB+30;
d.CustomColC = x.ColC+50;
return d;
//return x;
});
结果显示在监视面板中:'newList.FirstOrDefault()' threw an exception of type 'Microsoft.CSharp.RuntimeBinder.RuntimeBinderException'
更新
注意:我在我的问题中写道,我有50个专栏并写了一篇 示例向您显示我不想要名称Select中的所有列! (我知道我可以在Select中写出所有53列的名称!)所以这不是正确答案。
注意2:在真实的项目中我有复杂的自定义列,但我在这里写了一个非常简单的例子来展示我想要的东西。请写下您灵活的答案。谢谢。
答案 0 :(得分:1)
所以你要做的是基本上映射一组属性。有这样的图书馆,Automapper是一个很好的。但是,您也可以使用继承类中的反射构造函数自己完成此操作。这看起来像这样:
假设:
public class CustomColumns : Cols
{
public int CustomColA {
get{
return this.ColA + 10;
}
}
public int CustomColB {
get{
return this.ColB + 30;
}
}
public int CustomColC {
get{
return this.ColC + 50;
}
}
public CustomColumns(Cols cols)
{
string[] localNames = this.GetType().GetMembers().Where(m => m.MemberType == MemberTypes.Property).Select(m => m.Name).ToArray();
string[] ctorNames = cols.GetType().GetMembers().Where(m => m.MemberType == MemberTypes.Property).Select(m => m.Name).ToArray();
string[] names = localNames.Intersect(ctorNames).ToArray();
foreach (string s in names)
{
PropertyInfo propSet = this.GetType().GetProperty(s);
PropertyInfo propGet = typeof(Cols).GetProperty(s);
propSet.SetValue(this, propGet.GetValue(cols, null));
}
}
}
以下是dotnetfiddle的一个演示:https://dotnetfiddle.net/AKPYQD
答案 1 :(得分:-2)
在Select
:
var newList = list.Select(x =>
new
{
ColA = x.ColA,
ColB = x.ColB,
ColC = x.ColC,
CustomColA = x.ColA+10;
CustomColB = x.ColB+30;
CustomColC = x.ColC+50;
}).ToList();
答案 2 :(得分:-3)
.Select()
正在创建一个新对象。即使你刚写了:
var newList = list.Select(x => new
{ x });
您已获得嵌套属性。您只需要将每个列显式分配给一个新属性(您真的需要所有50个列吗?)