2010-11-20 9 views
3

私はサードパーティのlibを使って仕事をしています。オブジェクトをlibに渡して、オブジェクトの各プロパティに対していくつかのアクションを実行します。リフレクションを使用してプロパティを列挙します。これは実装されており、変更できません。.netで実行時にオブジェクトにプロパティを追加する方法は?

私は、コンパイル時にlibがどのような数のプロパティを処理するべきか分かりません。この情報は実行時にのみ利用可能です。だから私は私のソースコードでクラス宣言を作成することはできません。

dynamic .net4の機能は、反射を使用しているため動的ではないため、私を助けません。

実は私はここに2つのオプションのみ見ることができます:

class Data 
{ 
    public object P1 {get; set;} 
    public object P2 {get; set;} 
    .... 
    public object PN {get; set;} // N should be at least 10.000 
} 
  • 、実行時にクラス定義を生成し、使用にそれをコンパイルするCSharpCodeProviderを使用します。このような巨大なクラス定義を作成します

    1. を。

    他にもお勧めしますか?

    悲しいことに、私はこのlibを別のものに置き換えることはできません。

  • +0

    は、あなたが使用しているのlibに関する詳細を提供してもらえますか? – arul

    答えて

    2

    第1のアプローチを使用すると、メモリ消費量が高くなります。私は実行時に新しい型を作成するためにTypeBuilderクラスを使用することを選択しました。

    2

    あなたが探しているものはProperty Bagとして知られています。 ICustomTypeDescriptorを使用して追加のメタデータを公開する(ライブラリがサポートしていると仮定して)、このようなものを実装できます。

    消費ライブラリがReflectionを直接使用している場合(タイプ記述子のようなデザイナー機能を利用しない場合)、おそらく追加のプロパティを持つプロキシラッパーが動的に生成されます。 Castle DynamicProxyはこれを行う良い方法の1つです。


    EDIT:

    実は、私は城がプロキシオブジェクトに新しいプロパティを追加サポートしているかはわかりません。 TypeBuilderで直接IL Emitを使用しているかもしれません。これは、プロパティアクセサーを生成するためにIL Emitについて十分に学ぶ必要があるため、少し習得する必要があるため、自明ではありません。それは面白い、面白いもので、時間があれば努力する価値があると言いました。

    1

    グリッドやPropertyGridのような通常のGUI要素だと思います。

    次に、パラメータとしてクラスインスタンスを受け入れるグリッドのメソッドをリフレッシュし、可能であれば内部ディクショナリまたはディクショナリを自分の値で埋めることから始めます。

    これが不可能な場合は、代わりにエミットの、System.CodeDomを使用するようにしてください: http://blogs.msdn.com/b/lukeh/archive/2007/07/11/c-3-0-and-codedom.aspx

    関連する問題