在运行时动态添加属性是各种编程场景中的常见需求。虽然使用字典或集合等方法在某些情况下就足够了,但它们可能并不适合所有用例。让我们探索利用 ExpandoObject 的替代解决方案。
ExpandoObject 是 .NET 中的内置类,允许您在运行时动态添加和删除成员,从而能够分配和检索通过标准点语法的值。这种方法提供了一种便捷的方法来创建具有动态确定属性的动态对象。
要使用 ExpandoObject,您只需创建一个新实例并根据需要分配属性即可:
dynamic dynObject = new ExpandoObject(); dynObject.SomeDynamicProperty = "Hello!";
如果您对动态对象的行为有特定要求,您可以扩展 DynamicObject 类并实现用于处理成员访问和修改的自定义逻辑。下面是一个示例:
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) { return _properties.TryGetValue(binder.Name, out result); } public override bool TrySetMember(SetMemberBinder binder, object value) { _properties[binder.Name] = value; return true; } }
使用此自定义动态对象,您可以创建具有属性的动态对象并在运行时动态修改它们:
var dyn = GetDynamicObject(new Dictionary<string, object>() { { "prop1", 12 } }); Console.WriteLine(dyn.prop1); dyn.prop1 = 150;
而使用 DynamicObject 提供了灵活性和易用性,它还引入了一些潜在的缺点:
因此,在选择最适合您的开发需求的方法时,必须平衡动态对象操作的好处与这些注意事项。
以上是如何使用 ExpandoObject 和 DynamicObject 在运行时动态添加 C# 属性?的详细内容。更多信息请关注PHP中文网其他相关文章!