Field
(またはFieldInfo
など)を実行時にクラスに追加する方法はありますか?C#のクラスにフィールドを動的に追加するには
答えて
実行時にクラス定義を変更することはできません。ただし、元のクラス(sealed
でない場合)から継承し、フィールドを宣言する新しいクラスを作成できます。これは、System.Reflection.Emit
を使用して適切なILコードを放出することによって行うことができます。
いいえ、C#はmonkey-patchingを許可しません。
新しいクラスを生成するには、CodeDOMまたはReflection.Emitを使用しますが、既存のものは変更できません。
サルパッチと呼ばれていますか?その言葉はどこから生じたのですか? –
どこから来たのか分かりませんが、私はWikipediaエントリーへのリンクを追加しました。 –
モンキーパッチはRubyに由来する用語です。ジェフアトウッドは、数年前にブログ記事でそれについて書きました。 –
正確ではありません。
しかし、ICustomTypeDescriptorを実装して近似し、ハッシュテーブルを使用してフィールド名と値のペアを格納するだけで済みます。リフレクションを使用するフレームワークの多くは、まずICustomTypeDescriptorを要求します。
ありがとう、私はこのアプローチを試みたが、それは私のために働くdoesnt。私はimpellment IExpandoインターフェイスをJavaScriptコードが私のC#クラスのunexistedフィールドを呼び出すようにしようとしています。たとえば、 var o = new ActiveXObject( 'mCom'); o.ArbitraryField = "Foo"; 私のクラスではArbitraryFieldは存在しませんのでご注意ください。 –
IReflectの実装を試しましたか?これは、動的言語(少なくともC#4.0より前のバージョン)で相互運用するためのIDispatch/IExpandoを実装する方法です。 http://msdn.microsoft.com/en-us/library/system.reflection.ireflect.aspx ハッシュテーブルの実装でこの正確なことを行いました。うまく動作します – codekaizen
ダイナミックルックアップを追加し、DLRを組み込んだCLR 4.0をベースにしているため、クラスが画像に含まれないため、厳密にはクラスに追加されません。
これは可能だとは思いませんC#4.0では。私はあなたが既存のタイプを変更することはできないと思います。しかし、私はあなたが動的オブジェクト(例えば、Rubyから来ている)を作成し、それを変更することができると思います。 –
これは私が「厳密にクラスに追加するのではなく、クラスがピクチャにないので」という意味です。むしろ、 '動的'によって参照される個々のオブジェクトは、それまでに存在しなかったプロパティへの代入を受け入れることができ、動的にプロパティを追加することによってこれを処理することができます。 –
クラスのすべてがメタデータに基づいているため、C#では許可されていません。 CLR(C#ではなく)は、runtime(1)でメタデータにフィールドを追加することを禁止しています。これは、C#がrunitmeでフィールドを追加できる唯一の方法です。
これは、本質的に具体的なメタデータクラスを持たないIronPythonなどの動的ランゲージとは異なります。実行時に変更することができるより動的な構造を持っています。 IronPythonは、実行時に簡単に変更できるハッシュテーブルにどの程度の量のメンバ(フィールドとメソッド)を保持していると思います。
C#3.0では、Reflection.Emitを使用することをお勧めします。しかし、これは全く新しいクラスを生成し、既存のクラスを変更します。
(1)これにはプロファイリングAPIやENCなどのAPIがありますが、機能を拡張するかどうかはわかりません。
他にも既に述べたように、これは不可能です。あなたの質問の理由は何ですか?
class My {
Dictionary<string, object> data;
public My() { data = new Dictionary<string, object>(); }
}
..しかし、それは本当にあなたが実際に達成したいのかによって異なります。あなたは、動的にクラスにいくつかの追加データを保存する必要がある場合は、おそらく辞書を使用することができますか?
私の目的は、IExpandoインターフェイスを実装することです。私の最大の目的は、javascriptコードがActiveXオブジェクトに動的に「javascriptで」フィールドを追加できるようにすることです。たとえば、 var myobj = new ActiveXObject( 'server.object'); myobj.ArbitraryField = "何か"; 注意してくださいArbirtaryField does not exist –
をIDictionary
としてキャストして、C#4.0で簡単に行う方法については、this questionを参照してください。これにより、辞書に追加された値がオブジェクトのプロパティになります。私はanother answer of mineでこれが実証されていることを実証しています。
ただし、これはExpandoObject
のインスタンスまたはサブクラスDynamicObject
でのみ可能です。
IDynamicMetaObjectProvider
が実装されている場合は、他のクラスで使用することもできますが、正常に動作するにはあまりにも多くの作業が必要です。
おそらく、デコレータパターンを使用できます。
オブジェクト指向プログラミングでは、デコレータパターンは、同じクラスの他のオブジェクトの動作に影響を与えることなく、静的または動的に個々のオブジェクトに動作を追加できるデザインパターンです。
[私はC#で動的プロパティを作成するにはどうすればよい?](の- 1. AngularJS:フィールドを動的に追加はFormController
- 2. クラスに動的に追加する
- 3. フォームに動的フィールドを追加
- 4. 自動的にコンテンツを追加/フィールド(Wordpress)
- 5. MVC4 EditorForフィールドにラインアイテムを動的に追加する方法は?
- 6. 静的クラスを持つビューに動的クラスを追加する
- 7. ng-repeatでクラスを動的に追加
- 8. 入力ダイアログにフィールドを動的に追加する
- 9. Python:オブジェクトにフィールドを動的に追加する
- 10. Wordpress - 管理に新しいフィールドを動的に追加する
- 11. 動的に追加されたテンプレート要素にクラスを追加する
- 12. Zend Framework - 「コードモジュール」またはクラスを動的に追加する
- 13. c#.netのユーザ選択にコントロールを動的に追加する
- 14. C#動的に単語の文書に行を追加する
- 15. 動的に追加された入力フィールドを確認する
- 16. フィールドをFormTypeフォームに動的に追加することはできますか?
- 17. divをループして子クラスに動的にクラスを追加する
- 18. C#でプロジェクトに動的にファイルを追加する
- 19. MenuStripにToolStripMenuItemsを動的に追加する(C#/ Winforms)
- 20. イメージをにasp.netで動的に追加するC#
- 21. Devexpress GridControlをC#windowsアプリケーションに動的に追加する
- 22. XML項目をリストボックスに動的に追加する問題、C#
- 23. 動的にvb.netの動的パネルにイベントハンドラを追加する
- 24. ページ上で動的生成要素にクラスを追加する
- 25. モデルプロパティからWebgrid列に動的クラスを追加する
- 26. Jqueryクラスを動的に追加および削除する
- 27. C++の派生関数にコードを自動的に追加するには
- 28. 動的にスクロールビューにボタンを追加して追加する
- 29. 追加/削除、いくつかの入力フィールドを動的に
- 30. MySQLのフィールドにプレフィックスを自動追加
可能重複http://stackoverflow.com/questions/947241/how-do-i-create-dynamic-properties-in-c ) – nawfal