最初に、繰り返しではなく、コレクションを射影するための拡張メソッドを使用することをお勧めします。そのように:
var newCollection = oldCollection.Select(entity => MakeNewType(entity))
第二に、新しいフィールドで「Person を拡張する」という意味が完全には明確ではありません。これを実現する方法をいくつか紹介します。
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を使用できます。このシナリオは通常、動的プロキシ (実行時にのみ認識される機能を実装するサブクラス) を作成するために使用されます。エンティティ フレームワークがこれを行います。