実行時に動的に追加できるプロパティを持つ動的オブジェクトを作成する必要があるシナリオを考えてみましょう。辞書やパラメータのコレクションを使用する代わりに、ExpandoObject クラスを利用できます。
ExpandoObject
ExpandoObject を使用すると、実行時にインスタンスのメンバーを追加および削除できます。動的バインディング機能を有効にします。次の例に示すように、プロパティを動的に操作する便利な方法が提供されます。
dynamic dynObject = new ExpandoObject(); dynObject.SomeDynamicProperty = "Hello!";
カスタム ダイナミック オブジェクト
ExpandoObject アプローチに基づいて、動的プロパティの取得と設定を管理するカスタム動的オブジェクト。次のコードは、この概念を示しています。
public static dynamic GetDynamicObject(Dictionary<string, object> properties) { return new MyDynObject(properties); } public sealed class MyDynObject : DynamicObject { private readonly Dictionary<string, object> _properties; public MyDynObject(Dictionary<string, object> properties) { _properties = properties; } public override IEnumerable<string> GetDynamicMemberNames() { return _properties.Keys; } 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; } } public override bool TrySetMember(SetMemberBinder binder, object value) { if (_properties.ContainsKey(binder.Name)) { _properties[binder.Name] = value; return true; } else { return false; } } }
DynamicObject インターフェイスを実装することにより、動的メンバー アクセス メカニズムを完全に制御できるようになります。これにより、動的オブジェクトのカスタム ルールと動作を実装できます。
使用法
カスタム動的オブジェクトを配置すると、プロパティを追加し、それらを取得できます。ランタイム:
var dyn = GetDynamicObject(new Dictionary<string, object> { { "prop1", 12 }, }); Console.WriteLine(dyn.prop1); dyn.prop1 = 150;
注:
動的オブジェクトは強力ですが、注意して使用する必要があります。コンパイラは動的呼び出しを検証できないため、注意しないと実行時エラーが発生する可能性があります。実稼働コードで使用する前に、基礎となる仕組みと潜在的な問題を理解することが重要です。
以上がコレクションを使用せずに実行時に C# プロパティを動的に追加する方法の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。