全网整合营销服务商

电脑端+手机端+微信端=数据同步管理

免费咨询热线:400-708-3566

C#动态对象(dynamic)详解(实现方法和属性的动态)

C#的动态对象的属性实现比较简单,如果要实现动态语言那种动态方法就比较困难,因为对于dynamic对象,扩展方法,匿名方法都是不能用直接的,这里还是利用对象和委托来模拟这种动态方法的实现,看起来有点javascript的对象味道:

1) 定义一个委托,参数个数可变,参数都是object类型:这里的委托多有个dynamic参数,代表调用这个委托的动态对象本身。

public delegate object MyDelegate(dynamic Sender, params object[] PMs);

2) 定义一个委托转载对象,因为dynamic对象不能直接用匿名方法,这里用对象去承载:

public class DelegateObj
  {
    private MyDelegate _delegate;

    public MyDelegate CallMethod
    {
      get { return _delegate; }
    }
    private DelegateObj(MyDelegate D)
    {
      _delegate = D;
    }
    /// <summary>
    /// 构造委托对象,让它看起来有点javascript定义的味道.
    /// </summary>
    /// <param name="D"></param>
    /// <returns></returns>
    public static DelegateObj Function(MyDelegate D)
    {
      return new DelegateObj(D);
    }
  }

3) 定义一个动态对象:

public class DynObj : DynamicObject
  {
    //保存对象动态定义的属性值
    private Dictionary<string, object> _values;
    public DynObj()
    {
      _values = new Dictionary<string, object>();
    }
    /// <summary>
    /// 获取属性值
    /// </summary>
    /// <param name="propertyName"></param>
    /// <returns></returns>
    public object GetPropertyValue(string propertyName)
    {
      if (_values.ContainsKey(propertyName) == true)
      {
        return _values[propertyName];
      }
      return null;
    }
    /// <summary>
    /// 设置属性值
    /// </summary>
    /// <param name="propertyName"></param>
    /// <param name="value"></param>
    public void SetPropertyValue(string propertyName,object value)
    {
      if (_values.ContainsKey(propertyName) == true)
      {
        _values[propertyName] = value;
      }
      else
      {
        _values.Add(propertyName, value);
      }
    }
    /// <summary>
    /// 实现动态对象属性成员访问的方法,得到返回指定属性的值
    /// </summary>
    /// <param name="binder"></param>
    /// <param name="result"></param>
    /// <returns></returns>
    public override bool TryGetMember(GetMemberBinder binder, out object result)
    {
      result = GetPropertyValue(binder.Name);
      return result == null ? false : true;
    }
    /// <summary>
    /// 实现动态对象属性值设置的方法。
    /// </summary>
    /// <param name="binder"></param>
    /// <param name="value"></param>
    /// <returns></returns>
    public override bool TrySetMember(SetMemberBinder binder, object value)
    {
      SetPropertyValue(binder.Name, value);
      return true;
    }
    /// <summary>
    /// 动态对象动态方法调用时执行的实际代码
    /// </summary>
    /// <param name="binder"></param>
    /// <param name="args"></param>
    /// <param name="result"></param>
    /// <returns></returns>
    public override bool TryInvokeMember(InvokeMemberBinder binder, object[] args, out object result)
    {
      var theDelegateObj = GetPropertyValue(binder.Name) as DelegateObj;
      if (theDelegateObj == null || theDelegateObj.CallMethod == null)
      {
        result = null;
        return false;
      }
      result = theDelegateObj.CallMethod(this,args);
      return true;
    }
    public override bool TryInvoke(InvokeBinder binder, object[] args, out object result)
    {
      return base.TryInvoke(binder, args, out result);
    }
  }

应用测试代码:

dynamic theObj = new DynObj();
      theObj.aaa = "this is a test";//动态属性
      //动态方法,这里不能没法定义参数,调用的时候可以是任意多参数,具体参数类型和含义就只能自己去小心处理了.
      theObj.show = DelegateObj.Function((s, pms) =>
      {
        if (pms != null && pms.Length > 0)
        {
          MessageBox.Show(pms[0].ToString() + ":" + s.aaa);
        }
        else
        {
          MessageBox.Show(s.aaa);
        }
        return null;
      }
      );
      
theObj.show("hello");

虽然看起来上面有点Js定义对象方法的味道,但由于C#是静态语言,提供的动态模拟机制还是有限的,看起来是动态,但所有的值存放和方法都需要自己写代码去处理.

上面代码在vs2010,windows 2008 server,框架4.0 上测试OK.

以上这篇C#动态对象(dynamic)详解(实现方法和属性的动态)就是小编分享给大家的全部内容了,希望能给大家一个参考,也希望大家多多支持。


# dynamic对象  # 详解C# 匿名对象(匿名类型)、var、动态类型 dynamic  # C# dynamic关键字的使用方法  # C# Dynamic关键字之:dynamic为什么比反射快的详解  # C#使用dynamic类型访问JObject对象  # C#中dynamic关键字的正确用法(推荐)  # 深入浅析C#中的var和dynamic  # c#使用dynamic类型优化反射的方法  # c# dynamic的使用详解  # C# 反射与dynamic最佳组合示例代码  # C#中dynamic动态类型的具体使用  # 都是  # 给大家  # 有个  # 希望能  # 让它  # 这篇  # 不能用  # 小编  # 大家多多  # 但由于  # gt  # summary  # _delegate  # DelegateObj  # CallMethod  # private  # lt  # return  # param  # string 


相关文章: 如何选择适合PHP云建站的开源框架?  在线ppt制作网站有哪些软件,如何把网页的内容做成ppt?  企业网站制作公司网页,推荐几家专业的天津网站制作公司?  制作国外网站的软件,国外有哪些比较优质的网站推荐?  购物网站制作费用多少,开办网上购物网站,需要办理哪些手续?  Python lxml的etree和ElementTree有什么区别  网站专业制作公司,网站编辑是做什么的?好做吗?工作前景如何?  已有域名和空间,如何快速搭建网站?  东莞市网站制作公司有哪些,东莞找工作用什么网站好?  长春网站建设制作公司,长春的网络公司怎么样主要是能做网站的?  魔方云NAT建站如何实现端口转发?  建站168自助建站系统:快速模板定制与SEO优化指南  网页设计与网站制作内容,怎样注册网站?  建站主机与服务器功能差异如何区分?  建站之星展会模版如何一键下载生成?  如何制作算命网站,怎么注册算命网站?  山东网站制作公司有哪些,山东大源集团官网?  图册素材网站设计制作软件,图册的导出方式有几种?  如何用花生壳三步快速搭建专属网站?  上海网站制作网页,上海本地的生活网站有哪些?最好包括生活的各个方面的?  如何在Mac上搭建Golang开发环境_使用Homebrew安装和管理Go版本  javascript中对象的定义、使用以及对象和原型链操作小结  建站之星好吗?新手能否轻松上手建站?  建站之星如何通过成品分离优化网站效率?  巅云智能建站系统:可视化拖拽+多端适配+免费模板一键生成  如何通过万网虚拟主机快速搭建网站?  如何在新浪SAE免费搭建个人博客?  学校建站服务器如何选型才能满足性能需求?  免费制作统计图的网站有哪些,如何看待现如今年轻人买房难的情况?  网站海报制作教学视频教程,有什么免费的高清可商用图片网站,用于海报设计?  建站主机服务器选购指南:轻量应用与VPS配置解析  营销式网站制作方案,销售哪个网站招聘效果最好?  如何在腾讯云服务器上快速搭建个人网站?  制作网站软件推荐手机版,如何制作属于自己的手机网站app应用?  Avalonia如何实现跨窗口通信 Avalonia窗口间数据传递  深圳 网站制作,深圳招聘网站哪个比较好一点啊?  如何在云主机上快速搭建网站?  成都网站制作公司哪家好,四川省职工服务网是做什么用?  公司网站建设制作费用,想建设一个属于自己的企业网站,该如何去做?  沈阳制作网站公司排名,沈阳装饰协会官方网站?  ,制作一个手机app网站要多少钱?  相亲简历制作网站推荐大全,新相亲大会主持人小萍萍资料?  制作网站的过程怎么写,用凡科建站如何制作自己的网站?  如何选择最佳自助建站系统?快速指南解析优劣  宁波自助建站系统如何快速打造专业企业网站?  TestNG的testng.xml配置文件怎么写  制作网站公司那家好,网络公司是做什么的?  c++怎么实现高并发下的无锁队列_c++ std::atomic原子变量与CAS操作【详解】  制作网站的基本流程,设计网站的软件是什么?  如何在香港免费服务器上快速搭建网站? 

您的项目需求

*请认真填写需求信息,我们会在24小时内与您取得联系。