.NET 3.5 で実行時にリフレクションを介して C# 3.0 匿名オブジェクトを作成する方法はありますか? シリアル化スキームでそれらをサポートしたいので、プログラムで操作する方法が必要です。
ユースケースを明確にするために後で編集
追加の制約は、Silverlight アプリ内ですべてを実行することです。そのため、追加のランタイムはオプションではなく、オンザフライでコードを生成する方法が不明です。
.NET 3.5 で実行時にリフレクションを介して C# 3.0 匿名オブジェクトを作成する方法はありますか? シリアル化スキームでそれらをサポートしたいので、プログラムで操作する方法が必要です。
ユースケースを明確にするために後で編集
追加の制約は、Silverlight アプリ内ですべてを実行することです。そのため、追加のランタイムはオプションではなく、オンザフライでコードを生成する方法が不明です。
はいあります。メモリから:
public static T create<T>(T t)
{
return Activator.CreateInstance<T>();
}
object anon = create(existingAnonymousType);
ここに別の方法がありますが、より直接的なようです。
object anon = Activator.CreateInstance(existingObject.GetType());
また、FormatterServices クラスを調べることもできます: FormatterServices のMSDN エントリ
これには、クラスの空のインスタンスを作成する GetSafeUninitializedObject と、シリアル化を行うときに便利な他のいくつかのメソッドが含まれています。
Michael からのコメントへの返信: 型 T の Type インスタンスがない場合は、いつでも typeof(T) から取得できます。不明なタイプのオブジェクトがある場合は、そのオブジェクトに対して GetType() を呼び出して Type インスタンスを取得できます。
Reflection.Emit を使用して必要なクラスを動的に生成できますが、コードを作成するのはかなり面倒です。
このルートを決定する場合は、Reflection Emit Language Addin for .NET Reflectorをダウンロードすることをお勧めします。これにより、既存のクラスが Reflection.Emit を使用してどのように構築されるかを確認できるため、フレームワークのこのコーナーを学習するための良い方法となります。
リフレクションを使用して Type を取得し、型で GetConstructor を使用し、コンストラクターで Invoke を使用します。
編集:尋ねられていない質問に答えたことを指摘してくれたSklivvzに感謝します;)
実際の質問への答え: C# コードを生成し、CodeDomProvider を使用して (ただし、CodeDOM 自体はひどい)、それをコンパイルして、そこから型を反映させることが、「匿名」オブジェクトを実行する最も簡単な方法であることがわかりました。ランタイム。
DLR を調べてみてください。私は(まだ)そうしていませんが、DLR(動的言語)のユースケースは、あなたがやろうとしていることとよく似ています。
やりたいことによっては、Castle フレームワークの動的プロキシ オブジェクトも適している場合があります。