欧美bbbwbbbw肥妇,免费乱码人妻系列日韩,一级黄片

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

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

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

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

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

private string name;

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

image

clip_image002

clip_image004

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

難道是因為private拋出了異常嗎??

再次看看Msdn對此的TrySetMember方法的解釋:

Msdn備注

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

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

因為name是public,所以查找到了,然后返回,不會去調(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;
}



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

clip_image002[5]

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

為了驗證是不是這樣,將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();
}

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

clip_image002[9]

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

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

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

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

輸出為GetMember of property P1

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

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

相關(guān)文章

  • C#?崩潰異常中研究頁堆布局的詳細過程

    C#?崩潰異常中研究頁堆布局的詳細過程

    最近遇到一位朋友的程序崩潰,發(fā)現(xiàn)崩潰點在富編輯器 msftedit 上,這個不是重點,重點在于發(fā)現(xiàn)他已經(jīng)開啟了 頁堆,由于 頁堆 和 NT堆 的內(nèi)存布局完全不一樣,這一篇結(jié)合我的了解以及 windbg 驗證來系統(tǒng)的介紹下 頁堆,需要的朋友可以參考下
    2022-10-10
  • C# dll代碼混淆加密的實現(xiàn)

    C# dll代碼混淆加密的實現(xiàn)

    本文主要介紹了C# dll代碼混淆加密的實現(xiàn),文中通過示例代碼介紹的非常詳細,對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧
    2023-02-02
  • C#中參數(shù)的傳遞方式詳解

    C#中參數(shù)的傳遞方式詳解

    本文詳細講解了C#中參數(shù)的傳遞方式,文中通過示例代碼介紹的非常詳細。對大家的學(xué)習(xí)或工作具有一定的參考借鑒價值,需要的朋友可以參考下
    2022-07-07
  • 高效C#編碼優(yōu)化原則

    高效C#編碼優(yōu)化原則

    這篇文章主要介紹了高效C#編碼優(yōu)化原則,非常實用,需要的朋友可以參考下
    2014-08-08
  • C#虛函數(shù)用法實例分析

    C#虛函數(shù)用法實例分析

    這篇文章主要介紹了C#虛函數(shù)用法,實例分析了C#中虛函數(shù)的功能與基本使用技巧,需要的朋友可以參考下
    2015-07-07
  • c# socket編程udp客戶端實現(xiàn)代碼分享

    c# socket編程udp客戶端實現(xiàn)代碼分享

    這篇文章主要介紹了c# socket編程實現(xiàn)udp客戶端,大家參考使用吧
    2013-12-12
  • 可空類型Nullable<T>用法詳解

    可空類型Nullable<T>用法詳解

    本文詳細講解了可空類型Nullable<T>的用法,文中通過示例代碼介紹的非常詳細。對大家的學(xué)習(xí)或工作具有一定的參考借鑒價值,需要的朋友可以參考下
    2022-02-02
  • 詳解C# WebApi 接口測試工具:WebApiTestClient

    詳解C# WebApi 接口測試工具:WebApiTestClient

    這篇文章主要介紹了詳解C# WebApi 接口測試工具:WebApiTestClient,小編覺得挺不錯的,現(xiàn)在分享給大家,也給大家做個參考。一起跟隨小編過來看看吧
    2018-07-07
  • C#實現(xiàn)數(shù)字華容道游戲

    C#實現(xiàn)數(shù)字華容道游戲

    這篇文章主要為大家詳細介紹了C#實現(xiàn)數(shù)字華容道游戲,文中示例代碼介紹的非常詳細,具有一定的參考價值,感興趣的小伙伴們可以參考一下
    2022-02-02
  • SQL+C#實現(xiàn)獲得當(dāng)前月的第一天與最后一天

    SQL+C#實現(xiàn)獲得當(dāng)前月的第一天與最后一天

    本文分享了SQL+C#獲得當(dāng)前月的第一天與最后一天的代碼實例,代碼簡潔,適合初學(xué)者參考。需要的朋友可以看下
    2016-12-12

最新評論