栏目分类:
子分类:
返回
名师互学网用户登录
快速导航关闭
当前搜索
当前分类
子分类
实用工具
热门搜索
名师互学网 > IT > 面试经验 > 面试问答

在运行时动态添加C#属性

面试问答 更新时间: 发布时间: IT归档 最新发布 模块sitemap 名妆网 法律咨询 聚返吧 英语巴士网 伯小乐 网商动力

在运行时动态添加C#属性

您是否看过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派生而来的是,您可以提出自己的策略来处理这些动态成员请求, 请注意,这里 有很多 怪物: 编译器将 无法
验证您的大量动态调用,并且您不会得到智能感知,因此只需保持记住这一点。



转载请注明:文章转载自 www.mshxw.com
本文地址:https://www.mshxw.com/it/442797.html
我们一直用心在做
关于我们 文章归档 网站地图 联系我们

版权所有 (c)2021-2022 MSHXW.COM

ICP备案号:晋ICP备2021003244-6号