首先,我建议使用扩展方法来投影集合而不是迭代。像那样:
var newCollection = oldCollection.Select(entity => MakeNewType(entity))
其次,使用新字段“扩展人”是什么意思并不完全清楚。以下是您可以实现这一目标的几种方法。
1)使用新字段创建另一个类并将其映射到旧类。这是 asp.net mvc 应用程序的常见场景,您将模型映射到适当的视图模型。Automapper 对于这些类型的场景很有用(参见 Sławomir Rosiek anwser)
2) 在 c# 4+ 中利用 dlr。Yuo 将失去对动态对象的智能感知,但它们可以通过函数传递
var newPeople = people.Select(p =>
{
dynamic expando = new ExpandoObject();
expando.Id = p.Id;
expando.FirtName = p.FirtName;
/* ... */
expando.CurrentDateTime = DateTime.Now;
return expando;
});
3) 使用匿名类型。匿名类型不能传递给其他函数,因此当您需要在单个方法中快速投影数据并计算一些结果时,这种方法很有用
var newPeople = people.Select(p => new
{
Id = p.Id,
FirtName = p.FirtName,
/* ... */
CurrentDateTime = DateTime.Now
});
在这两种情况下,您现在都可以访问新“创建”的属性:
foreach(var p in newPeople)
{
Console.WriteLine("CurrentDateTime: {0}", p.CurrentDateTime);
}
4) 如果你真的需要在运行时创建一个功能齐全的 .net 类,你可以使用Reflection.Emit。这种情况通常用于创建动态代理 - 实现某些仅在运行时才知道的功能的子类。实体框架执行此操作。