当前位置:  编程技术>.net/c#/asp.net

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

    来源: 互联网  发布时间:2014-10-20

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

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)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 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方法没有被调用??

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


    
 
 
 
本站(WWW.)旨在分享和传播互联网科技相关的资讯和技术,将尽最大努力为读者提供更好的信息聚合和浏览方式。
本站(WWW.)站内文章除注明原创外,均为转载、整理或搜集自网络。欢迎任何形式的转载,转载请注明出处。












  • 相关文章推荐
  • java命名空间javax.xml.soap接口soapconstants成员方法: dynamic_soap_protocol定义参考
  • jQuery信息提示插件 Dynamic tooltip
  • dhcpd.conf中range dynamic-bootp后面如何进行分段地址书写?
  • Java Dynamic DNS Client
  • Dynamic Form Backgrounds
  • Spring Dynamic Modules
  • 请教snort中dynamic的count用法?
  • 160.243.145.61.broad.zh.gd.dynamic.163data.com.cn
  • 如何使用gcc生成dynamic objs
  • jQuery图片轮换插件 jQuery Dynamic Slideshow
  • C++ 中dynamic_cast<>的使用方法小结
  • eclipse配置tomcat开发Dynamic Web Project环境图解
  • static_cast,dynamic_cast,reinterpret_cast,const_cast的区别及用法详解
  • c++ dynamic_cast与static_cast使用方法示例
  • 关于linux下dynamic_cast无法正确转换的问题
  • static_cast,dynamic_cast,reinterpret_cast和const_cast的区别详解
  • C++中的类型转换static_cast、dynamic_cast、const_cast和reinterpret_cast总结


  • 站内导航:


    特别声明:169IT网站部分信息来自互联网,如果侵犯您的权利,请及时告知,本站将立即删除!

    ©2012-2021,,E-mail:www_#163.com(请将#改为@)

    浙ICP备11055608号-3