考虑一个场景,您需要创建一个动态对象,其中的属性可以在运行时动态添加。您可以利用 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中文网其他相关文章!