none
如何呼叫類別中沒顯示的方法? RRS feed

  • 問題

  • 我參考了一個Managed的DLL,並且using了此dll的所有namespace,

    裡面有一個類別為 TestClass,

    其中它內有一個唯讀屬性 Me,傳回Object型別,

    而當我使用C#或VB.NET去建構完後這個TestClass,

    再使用存取運算子 . 去顯示Me底下的方法,

    只能看到 Equals()、GetHashCode()、GetType()、ReferenceEquals()、ToString () ,如下:

     

    TestClass test = new
    
     TestClass();
    test.Me.方法();

     

    接著我使用reflector這套軟體反組譯此DLL,

    發現此屬性是繼承介面來的,

    接著我找到此介面裡面Me屬性的反組譯程式碼:

     

    [return
    
    : MarshalAs(UnmanagedType.Struct)][MethodImpl(MethodImplOptions.InternalCall, MethodCodeType=MethodCodeType.Runtime), DispId(4)]object
    
    
     get_Me();
    

     

    然後我看了其他介面,其中一個叫做IMe,

    裡面有一個唯讀屬性PresenceImage,傳回Object,

    接著我在VB.NET裡面寫了此段Code:

     

    Dim
    
     test As
    
     New
    
     TestClass()
    Debug.Print(test.Me .PresenceImage.ToString())

     

    想不到經過存取運算子沒顯示出的屬性(只有上面剛剛說的那些方法),

    居然可以使用!! 而且確實其他的屬性都測試可用,但在VB.NET與C#就是沒顯示出來,

    而我現在想把這個存取方法轉移到C#卻不行,

    C#在編譯的時候就會察覺到沒有這個成員存在,

    而VB.NET卻沒有察覺這個問題存在,

     

    請問我要如何在C#中也能將沒有顯示出來的屬性成功編譯過呢?

     

    但是我並不希望再VB.NET建構DLL給C#用唷! 希望能直接在C#使用此屬性。

     

    • 已編輯 js155036 2010年4月16日 上午 07:48 Code 亂跳
    2010年4月16日 上午 07:27

解答

  • 謝謝蹂躪大大回覆,

    可以請問"塞"到IMe介面是什麼意思呢?

    IMe介面是您提到的=>"然後我看了其他介面,其中一個叫做IMe,"

    您DLL內的成員若是Public的話

    這問題就是出在你沒轉型

    而直接拿Object的型態去使用

    因此要改為

    TestClass test = new TestClass();
    IMe ime= test.Me;
    Debug.Print(ime.PresenceImage.ToString())


    謙卑學習,持之以恆,才能不斷的Level Up http://www.dotblogs.com.tw/larrynung/
    • 已標示為解答 js155036 2010年4月16日 上午 11:08
    2010年4月16日 上午 09:14

所有回覆

  • Hi,

    看來是VB.NET支援晚期繫結的關係

    你把C#建出的物件塞到IMe介面再使用看看


    謙卑學習,持之以恆,才能不斷的Level Up http://www.dotblogs.com.tw/larrynung/
    2010年4月16日 上午 08:00
  • 謝謝蹂躪大大回覆,

    可以請問"塞"到IMe介面是什麼意思呢?

    2010年4月16日 上午 08:15
  • 如果類別有一些 private 或 protected 方法的話,你可以利用 Reflection 去呼叫它 (在 BindingFlag 中加上 NonPublic 旗標值)。
    但是這樣做可能會有一些副作用,因為你不知道它內部是怎麼跑的。


    以下為簽名檔,請勿對號入座:
    初學不是問題,但用不正確的態度來問問題,那就是很大的問題。
    請不要藉新手之名行小白之實,否則只會讓更多無辜的新手得不到幫助而已。
    如果不知道什麼是小白,請參閱:何謂小白
    • 已標示為解答 js155036 2010年4月16日 上午 11:08
    • 已取消標示為解答 js155036 2010年4月16日 上午 11:08
    2010年4月16日 上午 08:21
    版主
  • 謝謝蹂躪大大回覆,

    可以請問"塞"到IMe介面是什麼意思呢?

    IMe介面是您提到的=>"然後我看了其他介面,其中一個叫做IMe,"

    您DLL內的成員若是Public的話

    這問題就是出在你沒轉型

    而直接拿Object的型態去使用

    因此要改為

    TestClass test = new TestClass();
    IMe ime= test.Me;
    Debug.Print(ime.PresenceImage.ToString())


    謙卑學習,持之以恆,才能不斷的Level Up http://www.dotblogs.com.tw/larrynung/
    • 已標示為解答 js155036 2010年4月16日 上午 11:08
    2010年4月16日 上午 09:14
  • 超讚的!!

     

    沒錯!!我就是差在轉型!!

     

    感恩!! 原來我問題出在轉型!!

     

    在C#中,程式已經可以正常運作了

     

    感謝兩位大大回答。

    2010年4月16日 上午 11:08