当前位置: 移动技术网 > IT编程>开发语言>c# > C# Dynamic之:ExpandoObject,DynamicObject,DynamicMetaOb的应用(上)

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

2019年07月18日  | 移动技术网IT编程  | 我要评论

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

结果如下:

clip_image002

接收属性更改的通知:

复制代码 代码如下:

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

结果:

clip_image002[5]

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

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

image

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


结果如下:

clip_image002[7]

理论上来说,应该输出:

trysetmember          :设置name字段

trysetmember          :设置id属性

trygetmember          :获取id属性

trysetmember          :设置id属性

tryinvokemember      :调用showproduct方法

id =4 ,name = n1

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

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

如对本文有疑问, 点击进行留言回复!!

相关文章:

验证码:
移动技术网