実行時にオブジェクトにプロパティを動的に追加: ExpandoObject を使用したエレガントなソリューション
動的オブジェクトを操作する場合、多くの場合、プロパティを追加する必要があります。実行時のプロパティ。ディクショナリまたはコレクションを使用した従来のソリューションは場合によっては機能する場合もありますが、特定の状況では不十分です。この記事では、ExpandoObject の機能を活用する、より柔軟なアプローチを紹介します。
ExpandoObject を使用した動的プロパティの定義
ExpandoObject クラスを使用すると、非常に動的なオブジェクトを作成できます。静的クラスとは異なり、これらのオブジェクトは実行時にメンバーを追加、削除、変更できます。これにより、プロパティのセットが事前にわからないシナリオで特に役立ちます。
動的プロパティ追加の例
次のコード スニペットを考えてみましょう:
dynamic dynObject = new ExpandoObject(); dynObject.SomeDynamicProperty = "Hello!"; dynObject.SomeDynamicAction = (msg) => Console.WriteLine(msg); dynObject.SomeDynamicAction(dynObject.SomeDynamicProperty);
この例では、dynObject という名前の動的オブジェクトが作成され、次にそのメンバーである SomeDynamicProperty とSomeDynamicActionが追加されています。オブジェクトの動的な性質により、標準のドット表記を使用してこれらのプロパティとアクションにアクセスし、変更することができます。
プロパティ ディクショナリを使用した動的オブジェクトの作成
提示されたソリューションには、少し異なるアプローチ。 ExpandoObject にプロパティを直接追加する代わりに、DynamicObject から派生するラッパー クラスを作成します。このクラスでは、プロパティ ディクショナリがコンストラクター引数として提供されます。
public sealed class MyDynObject : DynamicObject { private readonly Dictionary<string, object> _properties; }
動的メンバー アクセスと管理
動的操作を処理するために、クラスは次のようなメソッドをオーバーライドします。 GetDynamicMemberNames、TryGetMember、 TrySetMember。これらのメソッドは、動的メンバーのアクセスと設定の動作を制御します。提供されたプロパティ ディクショナリを使用することで、これらのメソッドはプロパティのアクセスと変更を動的に処理できます。
ダイナミック オブジェクトの使用法
このカスタム DynamicObject クラスでは、次のように使用できます。
var dyn = GetDynamicObject(new Dictionary<string, object>() { { "prop1", 12 } }); Console.WriteLine(dyn.prop1); dyn.prop1 = 150;
要約すると、 ExpandoObject の機能を活用したり、カスタム DynamicObject クラスを作成したりすることで、実行時にオブジェクトのプロパティを管理する多用途かつ動的な方法が提供されます。これらの手法により、オブジェクトの動作に対する柔軟性と実行時の制御が提供されます。ただし、動的コードには慎重に取り組み、適切なテストを行い、その動的性質の影響を理解することが重要です。
以上が実行時に C# のオブジェクトにプロパティをエレガントに追加するにはどうすればよいですか?の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。