欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页  >  IT编程

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

程序员文章站 2023-12-17 13:08:22
expandoobject:表示一个对象,该对象包含可在运行时动态添加和移除的成员。 复制代码 代码如下:dynamic dyneo = new expandoobject...

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);
}

结果如下:

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

接收属性更改的通知:

复制代码 代码如下:

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);
}

结果:

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

system.dynamic.dynamicobject:提供用于指定运行时的动态行为的基类

新建类dynamicproduct,基本和product类似:

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

可以看到继承了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();
}


结果如下:

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

理论上来说,应该输出:

trysetmember          :设置name字段

trysetmember          :设置id属性

trygetmember          :获取id属性

trysetmember          :设置id属性

tryinvokemember      :调用showproduct方法

id =4 ,name = n1

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

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

上一篇:

下一篇: