您是否看过ExpandoObject?
参见:http :
//blogs.msdn.com/b/csharpfaq/archive/2009/10/01/dynamic-in-c-4-0-introducing-
the-
expandoobject.aspx
从MSDN:
通过ExpandoObject类,您可以在运行时添加和删除其实例的成员,还可以设置和获取这些成员的值。此类支持动态绑定,它使您可以使用诸如sampleObject.sampleMember之类的标准语法,而不是使用诸如sampleObject.GetAttribute(“
sampleMember”)之类的更复杂的语法。
让您做一些很酷的事情,例如:
dynamic dynObject = new ExpandoObject();dynObject.SomeDynamicProperty = "Hello!";dynObject.SomeDynamicAction = (msg) => { Console.WriteLine(msg); };dynObject.SomeDynamicAction(dynObject.SomeDynamicProperty);根据您的实际代码,您可能对以下内容更感兴趣:
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; } }}这样,您只需要:
var dyn = GetDynamicObject(new Dictionary<string, object>() { {"prop1", 12}, });Console.WriteLine(dyn.prop1);dyn.prop1 = 150;从DynamicObject派生而来的是,您可以提出自己的策略来处理这些动态成员请求, 请注意,这里 有很多 怪物: 编译器将 无法
验证您的大量动态调用,并且您不会得到智能感知,因此只需保持记住这一点。



