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
相关文章:
个人摄影网站制作流程,摄影爱好者都去什么网站?
清除minerd进程的简单方法
宝塔建站无法访问?如何排查配置与端口问题?
免费制作统计图的网站有哪些,如何看待现如今年轻人买房难的情况?
惠州网站建设制作推广,惠州市华视达文化传媒有限公司怎么样?
免费ppt制作网站,有没有值得推荐的免费PPT网站?
如何在万网主机上快速搭建网站?
深圳 网站制作,深圳招聘网站哪个比较好一点啊?
电影网站制作价格表,那些提供免费电影的网站,他们是怎么盈利的?
沈阳个人网站制作公司,哪个网站能考到沈阳事业编招聘的信息?
阿里云网站搭建费用解析:服务器价格与建站成本优化指南
如何选择高效便捷的WAP商城建站系统?
香港服务器建站指南:外贸独立站搭建与跨境电商配置流程
油猴 教程,油猴搜脚本为什么会网页无法显示?
中山网站推广排名,中山信息港登录入口?
高性能网站服务器部署指南:稳定运行与安全配置优化方案
如何快速生成高效建站系统源代码?
盘锦网站制作公司,盘锦大洼有多少5G网站?
建站之星如何通过成品分离优化网站效率?
宝盒自助建站智能生成技巧:SEO优化与关键词设置指南
宝塔Windows建站如何避免显示默认IIS页面?
学校免费自助建站系统:智能生成+拖拽设计+多端适配
网站制作价目表怎么做,珍爱网婚介费用多少?
如何快速搭建高效简练网站?
网站按钮制作软件,如何实现网页中按钮的自动点击?
专业商城网站制作公司有哪些,pi商城官网是哪个?
自助网站制作软件,个人如何自助建网站?
手机网站制作平台,手机靓号代理商怎么制作属于自己的手机靓号网站?
javascript中的try catch异常捕获机制用法分析
制作旅游网站html,怎样注册旅游网站?
定制建站流程步骤详解:一站式方案设计与开发指南
如何通过建站之星自助学习解决操作问题?
建站之星会员如何解锁更多建站功能?
建站之星如何助力网站排名飙升?揭秘高效技巧
宁波自助建站系统如何快速打造专业企业网站?
建站之星上传入口如何快速找到?
佛山网站制作系统,佛山企业变更地址网上办理步骤?
电脑免费海报制作网站推荐,招聘海报哪个网站多?
c++怎么用jemalloc c++替换默认内存分配器【性能】
文字头像制作网站推荐软件,醒图能自动配文字吗?
如何通过VPS建站实现广告与增值服务盈利?
建站之星在线版空间:自助建站+智能模板一键生成方案
ppt制作免费网站有哪些,ppt模板免费下载网站?
国美网站制作流程,国美电器蒸汽鍋怎么用官方网站?
Bpmn 2.0的XML文件怎么画流程图
高防服务器租用指南:配置选择与快速部署攻略
微信小程序制作网站有哪些,微信小程序需要做网站吗?
如何在阿里云高效完成企业建站全流程?
杭州银行网站设计制作流程,杭州银行怎么开通认证方式?
如何用y主机助手快速搭建网站?
*请认真填写需求信息,我们会在24小时内与您取得联系。