実行時にオブジェクトに動的プロパティを追加することは、多くのアプリケーションで共通の要件です。これを実現する一般的なアプローチは、パラメータの辞書またはコレクションを使用することです。ただし、プロパティの数と名前が事前に不明なシナリオでは、このアプローチは不十分です。
.NET Framework は、この問題に対する組み込みのソリューションである ExpandoObject を提供します。このクラスを使用すると、実行時にプロパティを追加および削除できる動的オブジェクトを作成できます。
// Create a dynamic object dynamic dynObject = new ExpandoObject(); // Add dynamic properties dynObject.SomeDynamicProperty = "Hello!"; // Execute dynamic actions dynObject.SomeDynamicAction = (msg) => { Console.WriteLine(msg); }; dynObject.SomeDynamicAction(dynObject.SomeDynamicProperty);
より複雑なシナリオの場合は、独自の動的オブジェクトを作成することもできます。 DynamicObject クラスを実装するオブジェクト。これにより、動的メンバー要求の処理方法をより詳細に制御できるようになります。
public sealed class MyDynObject : DynamicObject { // Member dictionary private readonly Dictionary<string, object> _properties; public MyDynObject(Dictionary<string, object> properties) { _properties = properties; } // Get dynamic member names public override IEnumerable<string> GetDynamicMemberNames() { return _properties.Keys; } // Try to get a dynamic member public override bool TryGetMember(GetMemberBinder binder, out object result) { if (_properties.ContainsKey(binder.Name)) { result = _properties[binder.Name]; return true; } else { result = null; return false; } } // Try to set a dynamic member public override bool TrySetMember(SetMemberBinder binder, object value) { if (_properties.ContainsKey(binder.Name)) { _properties[binder.Name] = value; return true; } else { return false; } } }
このアプローチを使用すると、任意のプロパティを持つ動的オブジェクトを作成できます。
var dyn = GetDynamicObject(new Dictionary<string, object>() { { "prop1", 12 } }); Console.WriteLine(dyn.prop1); dyn.prop1 = 150;
注意: 動的オブジェクトを使用する場合、コンパイラーは動的呼び出しを検証できず、ランタイム エラーやインテリセンスの不足が発生する可能性があることに注意してください。サポートします。
以上が実行時に C# プロパティを動的に追加するにはどうすればよいですか?の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。