六、DynamicObject和ExpandObject概述

本文介绍了C#中创建动态对象的两种方式:DynamicObject和ExpandObject。DynamicObject允许在运行时添加和访问属性,需要重写几个方法。而ExpandObject与DynamicObject相似,但直接可用,适用于简单动态对象的创建。文章通过实例演示了如何使用这两种动态对象,并展示了如何用它们处理CSV文件的数据解析。
摘要由CSDN通过智能技术生成

如果要创建自己的动态对象,该怎么办?有两种方法:从DynamicObject中派生,或者使用ExpandObject。使用DynamicObject需要做的工作较多,因为必须重写几个方法。ExpandObject是一个可立即使用的密封类。

1. DynamicObject

考虑一个表示人的对象。一般应定义名字、中间名和姓氏等属性。现在假定要在运行期间构建这个对象,且系统事先不知道该对象有什么属性或该对象可能支持什么方法。此时就可以使用基于DynamicObject的对象。需要这类功能的场合几乎没有,但到目前为止,C#语言还没有提供该功能。

首先看看DynamicObject:

    public class WroxDynamicObject:DynamicObject
    {
        private Dictionary<string,object> _dinamicData = new Dictionary<string, object>();
        public override bool TryGetMember(GetMemberBinder binder, out object result)
        {
            bool success = false;
            result = null;
            if(_dinamicData.ContainsKey(binder.Name))
            {
                result = _dinamicData[binder.Name];
                success = true;
            }
            else
            {
                result = "Property Not Found";
            }
            return success;
        }
        public override bool TrySetMember(SetMemberBinder binder, object value)
        {
            _dinamicData[binder.Name] = value;
            return true;
        }
        public override bool TryInvokeMember(InvokeMemberBinder binder, object[] args, out object result)
        {
            dynamic method = _dinamicData[binder.Name];
            result = method((DateTime)args[0]);
            return result != null;
        }

在这个示例中,重写了3个方法TyrGetMember()、TrySetMember()和TryInvokeMember()。

TrySetMember()方法给对象添加了新方法、属性或字段。本例把成员信息存储在一个Dictionary对象中。传送给TrySetMember()方法的SetMemberBInder对象包含Name属性,它用于标识Dictionary中的元素。

TryGetMember()方法根据GetMemberBinder对象的Name属性检索储存在Dictionary中的对象。

下面的代码使用了刚才新建的动态对象:

            dynamic wroxDyn = new WroxDynamicObject();
            wroxDyn.FirstName = "Bugs";
            wroxDyn.LastName = "Bunny";
            System.Console.WriteLine(wroxDyn.GetType());
            System.Console.WriteLine($"{wroxDy
  • 1
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值