2010-12-02 70 views

回答

9

有兩種方式:

  1. 創建一個子類,你要訪問其保護成員的類。
  2. 使用反射。

#1只有在您控制誰創建類的實例時纔有效。如果一個已經構建的實例正在交給你,那麼#2是唯一可行的解​​決方案。儘管如此,我個人認爲我已經用盡了所有其他可能的機制來實現你的功能。

0

如果您可以從具有該受保護成員的類派生而不是您可以訪問的類。
至於使用反射,this might help

0

您是否爲會員選擇了正確的附件?

  1. protected (C# Reference);
  2. public (C# Reference);
  3. private (C# Reference);
  4. internal (C# Reference)
  5. 您也可以結合內部保護

通過所有方式,保護訪問器指定只應在派生類中訪問成員。因此,如果您的目標是在派生類之外訪問它,或許您應該考慮使用publicinternal accessor !?

此外,這是可行的Reflection (C# and Visual Basic)

在另一方面,如果你真的想揭露一類的保護成員,我會嘗試使用公共成員和返回保護通過對它的引用。

但是,請問問自己,在曝光受保護的成員之前,您的設計是否良好。它看起來像我的設計氣味。

1

我有時需要做到這一點。當使用WinForms時,系統類中的值是您想要訪問的,但不能,因爲它們是私有的。爲了解決這個問題,我使用反射來訪問它們。例如...

// Example of a class with internal private field 
    public class ExampleClass 
    { 
     private int example; 
    } 

    private static FieldInfo _fiExample; 

    private int GrabExampleValue(ExampleClass instance) 
    { 
     // Only need to cache reflection info the first time needed    
     if (_fiExample == null) 
     { 
      // Cache field info about the internal 'example' private field 
      _fiExample = typeof(ExampleClass).GetField("example", BindingFlags.Instance | BindingFlags.NonPublic | BindingFlags.GetField); 
     } 

     // Grab the internal property 
     return (int)_fiExample.GetValue(instance); 
    }