在运行时向对象添加动态属性是许多应用程序中的常见要求。实现此目的的常见方法是使用字典或参数集合。但是,对于事先未知属性数量和名称的情况,这种方法就不够了。
.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中文网其他相关文章!