最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

C# Dynamic之:ExpandoObject,DynamicObject,DynamicMetaOb的應(yīng)用(下)

 更新時(shí)間:2013年05月14日 09:48:50   作者:  
本篇文章是對(duì)C#中ExpandoObject,DynamicObject,DynamicMetaOb的應(yīng)用進(jìn)行了詳細(xì)的分析介紹,需要的朋友參考下

接上文:C# Dynamic關(guān)鍵字之:ExpandoObject,DynamicObject,DynamicMetaOb的應(yīng)用(上)

為什么TryXXX方法沒有被調(diào)用??

將DynamicProduct 中的name修飾符改為private:

private string name;

可以在TrySetMember方法中設(shè)置斷點(diǎn),再次運(yùn)行:

image

clip_image002

clip_image004

為什么訪問修飾符是Public不調(diào)用TrySetMember,是Private 就調(diào)用了呢??

難道是因?yàn)閜rivate拋出了異常嗎??

再次看看Msdn對(duì)此的TrySetMember方法的解釋:

Msdn備注

…………….動(dòng)態(tài)語言運(yùn)行庫(kù) (DLR) 將首先使用語言聯(lián)編程序在類中查找屬性的靜態(tài)定義。 如果沒有此類屬性,DLR 調(diào)用 TrySetMember 方法。

問題的原因是這樣的:首先DLR 使用語言聯(lián)編程序在類中查找name的靜態(tài)定義,

因?yàn)閚ame是public,所以查找到了,然后返回,不會(huì)去調(diào)用TrySetMember方法了,

但是如果name是private,那么聯(lián)編程序在類中沒找到name的靜態(tài)定義,于是DLR嘗試調(diào)用TrySetMember方法。

修改TrySetMember方法如下:

復(fù)制代碼 代碼如下:

public override bool TrySetMember(SetMemberBinder binder, object value)
{
    Console.WriteLine("TrySetMember被調(diào)用了,Name:{0}", binder.Name);
    bool result = base.TrySetMember(binder, value);

    return true;
}



運(yùn)行,可以發(fā)現(xiàn)不會(huì)拋出異常了:

clip_image002[5]

總結(jié):首先DLR會(huì)嘗試查找屬性的靜態(tài)定義,如果沒有找到則會(huì)調(diào)用相應(yīng)的TryXXX 方法,如果TryXXX方法返回false,代表TryXXX方法運(yùn)行失敗,DLR隨后會(huì)拋出異常。

為了驗(yàn)證是不是這樣,將DynamicProduct中屬性的靜態(tài)定義全部注釋掉,并且TryXXX方法全部返回True。完整的代碼如下:

復(fù)制代碼 代碼如下:

class DynamicProduct : DynamicObject
{
    #region dynamicProduct 的一些屬性的靜態(tài)定義

        //private string name;
        //public int Id { get; set; }

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

    #endregion

    #region Override DynamicObject 的方法

    public override bool TryGetMember(GetMemberBinder binder, out object result)
    {
        Console.WriteLine("TryGetMember被調(diào)用了,Name:{0}", binder.Name);
        bool tryResult = base.TryGetMember(binder, out result);

        return true;
    }

    public override bool TrySetMember(SetMemberBinder binder, object value)
    {
        Console.WriteLine("TrySetMember被調(diào)用了,Name:{0}", binder.Name);
        bool tryResult = base.TrySetMember(binder, value);

        return true;
    }

    public override bool TryInvoke(InvokeBinder binder, object[] args, out object result)
    {
        Console.WriteLine("TryInvoke被調(diào)用了");
        bool tryResult = base.TryInvoke(binder, args, out result);

        return true;
    }

    public override bool TryInvokeMember(InvokeMemberBinder binder, object[] args, out object result)
    {
        Console.WriteLine("TryInvokeMember被調(diào)用了,Name:{0}", binder.Name);
        bool tryResult = base.TryInvokeMember(binder, args, out result);

        return true;
    }

    #endregion
}


Main方法不變:
復(fù)制代碼 代碼如下:

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

    dynProduct.name = "n1"; //調(diào)用TrySetMember方法
    dynProduct.Id = 1;
    dynProduct.Id = dynProduct.Id + 3;
    dynProduct.ShowProduct();

    Console.ReadLine();
}

運(yùn)行,結(jié)果如下:

clip_image002[9]

d.P3 = d.M1(d.P1, d.M2(d.P2));

按照從左到右,從里到外的原則。

1:先調(diào)用d.P1,DLR會(huì)嘗試調(diào)用d 的GetMetaObject 方法,此方法返回一個(gè)MyMetaObject對(duì)象。

接著DLR知道你調(diào)用的是一個(gè)屬性,于是它調(diào)用返回的MyMetaObject對(duì)象的BindGetMember 方法,

輸出為GetMember of property P1

2:調(diào)用d.P2,和調(diào)用d.P1 一樣.

3:調(diào)用d.M2,同樣DLR調(diào)用d的GetMetaObject方法,返回一個(gè)MyMetaObject對(duì)象,接著調(diào)用返回對(duì)象的BindInvokeMember 方法。

相關(guān)文章

最新評(píng)論

巨鹿县| 循化| 封丘县| 阿拉善左旗| 青浦区| 丹凤县| 平山县| 临沂市| 永平县| 辛集市| 西城区| 建瓯市| 三台县| 白朗县| 临漳县| 三原县| 股票| 上虞市| 民权县| 库车县| 文水县| 泰和县| 卢龙县| 凤冈县| 册亨县| 陆良县| 合山市| 潮安县| 阳江市| 平定县| 贵港市| 鞍山市| 灌阳县| 鄂伦春自治旗| 舒城县| 紫阳县| 石渠县| 收藏| 聊城市| 阜宁县| 新宁县|