C# Dynamic之:ExpandoObject,DynamicObject,DynamicMetaOb的应用(上)

ExpandoObject:表示一个对象,该对象包含可在运行时动态添加和移除的成员。


代码如下:

dynamic dynEO = new ExpandoObject();
dynEO.number = 10;
dynEO.Increment = new Action(() => { dynEO.number++; });

Console.WriteLine(dynEO.number);
dynEO.Increment();
Console.WriteLine(dynEO.number);

dynEO.number 中number是动态添加属性。

dynEO.Increment 中Increment 是动态添加的Action 委托。

枚举ExpandoObject的所有成员:


代码如下:

foreach (var property in (IDictionary<String, Object>)dynEO)
{
     Console.WriteLine(property.Key + ": " + property.Value);
}

结果如下:

接收属性更改的通知:

代码如下:

static void Main(string[] args)
{
   ………
    ((INotifyPropertyChanged)dynEO).PropertyChanged += new PropertyChangedEventHandler(Program_PropertyChanged);
    dynEO.Name = "changed";
    dynEO.Name = "another";

Console.ReadLine();
}

static void Program_PropertyChanged(object sender, PropertyChangedEventArgs e)
{
    Console.WriteLine("属性{0} 已更改", e.PropertyName);
}

结果:

System.Dynamic.DynamicObject:提供用于指定运行时的动态行为的基类

新建类DynamicProduct,基本和Product类似:

可以看到继承了DynamicObject后,可以override 一大堆TryXXX的方法了。

重点需要了解的是:

















假设sampleObject 就是dynamicObject

TryGetMember

在调用 int number = sampleObject.Number.时使用

TrySetMember

在调用sampleObject.Number = number 时使用

TryInvoke

在调用sampleObject(100) 时使用

TryInvokeMember

在调用sampleObject.someMethod(100) 时使用

完整的代码如下:

代码如下:

class DynamicProduct : DynamicObject
{
    public string name;
    public int Id { get; set; }

public void ShowProduct()
    {
        Console.WriteLine("Id={0} ,Name={1}", Id, name);
    }

#region Override DynamicObject 的方法

public override IEnumerable<string> GetDynamicMemberNames()
    {
        return base.GetDynamicMemberNames();
    }

public override bool TryGetMember(GetMemberBinder binder, out object result)
    {
        Console.WriteLine("TryGetMember被调用了,Name:{0}", binder.Name);
        return base.TryGetMember(binder, out result);
    }

public override bool TrySetMember(SetMemberBinder binder, object value)
    {
        Console.WriteLine("TrySetMember被调用了,Name:{0}", binder.Name);
        return base.TrySetMember(binder, value);
    }

public override bool TryInvoke(InvokeBinder binder, object[] args, out object result)
    {
        Console.WriteLine("TryInvoke被调用了");
        return base.TryInvoke(binder, args, out result);
    }

public override bool TryInvokeMember(InvokeMemberBinder binder, object[] args, out object result)
    {
        Console.WriteLine("TryInvokeMember被调用了,Name:{0}", binder.Name);
        return base.TryInvokeMember(binder, args, out result);
    }

#endregion
}

Main函数代码如下:


代码如下:

static void Main(string[] args)
{
    dynamic dynProduct = new DynamicProduct();

dynProduct.name = "n1"; //调用TrySetMember方法
    dynProduct.Id = 1;
    dynProduct.Id = dynProduct.Id + 3;
    dynProduct.ShowProduct();

Console.ReadLine();
}

结果如下:

.csharpcode, .csharpcode pre{font-size: small;color: black;font-family: consolas, "Courier New", courier, monospace;background-color: #ffffff;/*white-space: pre;*/}.csharpcode pre { margin: 0em; }.csharpcode .rem { color: #008000; }.csharpcode .kwrd { color: #0000ff; }.csharpcode .str { color: #006080; }.csharpcode .op { color: #0000c0; }.csharpcode .preproc { color: #cc6633; }.csharpcode .asp { background-color: #ffff00; }.csharpcode .html { color: #800000; }.csharpcode .attr { color: #ff0000; }.csharpcode .alt {background-color: #f4f4f4;width: 100%;margin: 0em;}.csharpcode .lnum { color: #606060; }

理论上来说,应该输出:

TrySetMember          :设置name字段

TrySetMember          :设置Id属性

TryGetMember          :获取Id属性

TrySetMember          :设置Id属性

TryInvokeMember      :调用ShowProduct方法

Id =4 ,Name = n1

为什么TryXXX方法没有被调用??

下篇将解释这个问题,请持续关注..

(0)

相关推荐

  • 详解C# 匿名对象(匿名类型)、var、动态类型 dynamic

    随着C#的发展,该语言内容不断丰富,开发变得更加方便快捷,C# 的锋利尽显无疑.C# 语言从诞生起就是强类型语言,这一性质到今天不曾改变,我想以后也不会变.既然是强类型语言,那编写任一程序均要求满足下面的基本条件: 1.变量声明必须指明其类型 2.变量类型明确后,其类型在Runtime亦不能改变 代码如下: public class Student { public string Name { get; set; } public int Age { get; set; } public str

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

    C#的动态对象的属性实现比较简单,如果要实现动态语言那种动态方法就比较困难,因为对于dynamic对象,扩展方法,匿名方法都是不能用直接的,这里还是利用对象和委托来模拟这种动态方法的实现,看起来有点javascript的对象味道: 1) 定义一个委托,参数个数可变,参数都是object类型:这里的委托多有个dynamic参数,代表调用这个委托的动态对象本身. public delegate object MyDelegate(dynamic Sender, params object[] PMs

  • C# Dynamic关键字之:解析dynamic就是Object

    C# 4.0提供了一个dynamic 关键字,那么什么是dynamic,究竟dynamic是如何工作的呢? 从最简单的示例开始: 复制代码 代码如下: static void Main(string[] args)        {            dynamic dyn = 1;            object obj = 1;            //在编译时将鼠标放到 "dyn"  和"obj"中可以发现:             // dyn:局

  • C# Dynamic关键字之:调用属性、方法、字段的实现方法

    新建类Product: 复制代码 代码如下: class Product{    public string name;    public int Id { get; set; } public void ShowProduct()    {        Console.WriteLine("Id={0} ,Name={1}", Id, name);    }} Main方法代码如下: 复制代码 代码如下: static void Main(string[] args){    /

  • C# 反射与dynamic最佳组合示例代码

    在 C# 中反射技术应用广泛,至于什么是反射.........你如果不了解的话,请看下段说明,否则请跳过下段.广告一下:喜欢我文章的朋友请关注一下我的blog,这也有助于提高本人写作的动力. 反射:当你背对一个美女或帅哥却不能回头仔细观察研究时(纯属虚构,如有巧合.纯属雷同),一面小镜子就能满足你的需求.在 C# 编程过程中也经常遇到类似的情况:有一个别人写的 dll 类库你想使用却没程序文档资料......此时通过 C# Runtime 提供的功能,你可以把该 dll 类库加载到你的程序中,并

  • C# dynamic关键字的使用方法

    C#是一种类型安全的编程语言(所有表达式都能解析成某个类型的实例,在编译器生成的代码中,只会执行对这个类型有效的操作),和非类型安全的语言相比,类型安全的优势就体现出来了:1.许多错误能在编译时检测到,取保代码在执行它之前是正确的.2.编译时语言通常能生成更小,更快的代码.(在编译时进行更多的假设,并在IL和元数据中落实那些假设) 为了方便开发人员使用反射或者与基本组件通信,dynamic诞生了!一下代码展示了如何利用反射在一个String目标("根据我找类型")上调用一个方法(&qu

  • C# Dynamic之:ExpandoObject,DynamicObject,DynamicMetaOb的应用(上)

    ExpandoObject:表示一个对象,该对象包含可在运行时动态添加和移除的成员. 复制代码 代码如下: dynamic dynEO = new ExpandoObject();dynEO.number = 10;dynEO.Increment = new Action(() => { dynEO.number++; }); Console.WriteLine(dynEO.number);dynEO.Increment();Console.WriteLine(dynEO.number); dy

  • C# Dynamic之:ExpandoObject,DynamicObject,DynamicMetaOb的应用(下)

    接上文:C# Dynamic关键字之:ExpandoObject,DynamicObject,DynamicMetaOb的应用(上) 为什么TryXXX方法没有被调用?? 将DynamicProduct 中的name修饰符改为private: private string name; 可以在TrySetMember方法中设置断点,再次运行: 为什么访问修饰符是Public不调用TrySetMember,是Private 就调用了呢?? 难道是因为private抛出了异常吗?? 再次看看Msdn对

  • C#使用Json.Net对JSON与对象的序列化与反序列化

    目录 一.使用Json.Net 1.把DataTable转换成json格式,使用最新Json.Net DLL ,已经内置转换器. 2.对Json.Net序列化和反序列化的控制 二.空值的处理 三.默认值的处理 四.忽略某些属性 五.支持非公共成员 六.日期处理 1.使用IsoDateTimeConverter 和 JavaScriptDateTimeConverter标准格式 1.如果你要序列化的日期格式是统一的,可以考虑如下方式 2.如果想要不同的日期类型成员序列化后,以不同的形式显示. 2.

  • 静态ARP与arp协议图解第1/3页

    WIN2000的时候ARP -S命令设置的STATIC ARP ENTRY还是经常被人ARP SPOOFING,最近实验WIN2003的ARP -S终于可以锁定ARP项再也不怕网络执法官这些软件了.该病毒发作时候的特征为,中毒的机器会伪造某台电脑的MAC地址,如该伪造地址为网关服务器的地址,那么对整个网吧均会造成影响,用户表现为上网经常瞬断. 一.在任意客户机上进入命令提示符(或MS-DOS方式),用arp –a命令查看:  C:\WINNT\system32>arp -a Interface:

  • Android开发5:应用程序窗口小部件App Widgets的实现(附demo)

    前言 本次主要是实现一个Android应用,实现静态广播.动态广播两种改变 widget内容的方法,即在上篇博文中实验的基础上进行修改,所以此次实验的重点是AppWidget小部件的实现啦~ 首先,我们简单说一下Widget是一个啥玩意~ 应用程序窗口小部件(Widget)是微小的应用程序视图,可以被嵌入到其它应用程序中(比如桌面)并接收周期性的更新.你可以通过一个App Widget provider来发布一个Widget.可以容纳其它App Widget的应用程序组件被称为App Widge

  • Javascript与flash交互通信基础教程

    下面是一些在Flash和使用Javascript的HTML文件直接通信的示例,每个示例都有简略的步骤 本文讨论了3种基本的Flash/Javascript通信方式: Javascript 到 Flash的通信----使用Flash播放器的javascript方法 Flash 到 Javascript的通信----使用Flash的fscommand Flash 到 Flash的通信----------使用本地连接对象或综合上2种技术 并不是所有的浏览器都很重视脚本.为了和Flash播放器通信,浏览

  • Springboot mybatis plus druid多数据源解决方案 dynamic-datasource的使用详解

    依赖 <dependency> <groupId>com.baomidou</groupId> <artifactId>dynamic-datasource-spring-boot-starter</artifactId> <version>2.5.0</version> </dependency> <dependency> <groupId>p6spy</groupId>

  • SpringBoot实现项目文件上传的方法详解

    目录 一.首先抛出问题 二.解决思路 三.直接看源码就懂了,下面是controller 四.结尾 一.首先抛出问题 以阿里云oss文件上传为例,假设我的需求是这样的,我需要发布一条动态,这条动态呢可以是图片.语音.视频,3种类型,每种类型的上传我必须要限制它的文件大小,超过了我就不能让他上传的.如果传统的方式,那就是创建3个上传类型bucket对应图片.语音和视频,其实这种做法是可以的,但是怎么说呢,还不够优雅,如果当这个动态有越来越多种类型,你是不是要建立N个类型对应呢,所以就会使得bucke

  • Asp.net core利用dynamic简化数据库访问

    今天写了一个数据库的帮助类,代码如下. public static class DbEx { public static dynamic ReadToObject(this IDataReader reader) { var obj = new DbObject(); for (int i = 0; i < reader.FieldCount; i++) { obj[reader.GetName(i)] = new DbField() { DbData = reader[i] }; } retu

  • 深入C# 4.0 新特性dynamic、可选参数、命名参数的详细介绍

    1.dynamic ExpandoObject熟悉js的朋友都知道js可以这么写 : 复制代码 代码如下: var t = new Object(); t.Abc = 'something'; t.Value = 243; 现在这个js动态语言的特性,我们也可以在c#中使用了,前提是将一个变量声明为ExpandoObject类型.如下例: 复制代码 代码如下: static void Main(string[] args) { dynamic t = new ExpandoObject(); t

随机推荐