2017-08-29 67 views
1

我需要訪問私有字段中的公共函數。使用反射C在私有字段中調用公共函數#

public partial class Form1 : Form 
{ 
    MainControl mainControl = new MainControl(); 
    public Form1() 
    { 
     InitializeComponent(); 
     var frame = mainControl.GetType().GetField("CustomControl", System.Reflection.BindingFlags.NonPublic | System.Reflection.BindingFlags.Instance); 
     frame.GetType().GetMethod("Display").Invoke(mainControl, new object[] { }); 
    } 
} 

public class MainControl 
{ 
    public MainControl() 
    { 
     CustomControl = new CustomControl(); 
    } 

    CustomControl CustomControl; 
} 

public class CustomControl 
{ 
    public CustomControl() 
    { 

    } 

    public void Display() 
    { 
     MessageBox.Show("Displayed"); 
    } 
} 

在這裏,我需要調用CustomControl類的顯示功能。

但我正在逐漸例外上述做法。誰可以幫我這個事?

+0

什麼是例外? – robjwilkins

+0

你知道你可以通過在設計時將'Modifiers'屬性設置爲'Public'來公開控制嗎? –

回答

1

你似乎並不理解反映非常好。要調用Display你需要做以下步驟:

  • 得到CustomControl字段作爲FieldInfo
  • 使用實例得到CustomControlmainControl
  • 得到TypeCustomControl
  • 得到MethodInfoTypeCustomControl
  • 呼叫的方法Display與值o ˚FCustomControl

你只做第一步,然後繼續讓你剛拿到現場,這僅僅是typeof(FieldInfo)的類型,然後嘗試從FieldInfo得到DisplayFieldInfo沒有這樣的方法。

我已經方便地作出這個代碼,以便每行對應於上述步驟之一。

var fieldInfo = mainControl.GetType().GetField("CustomControl", System.Reflection.BindingFlags.NonPublic | System.Reflection.BindingFlags.Instance); 
var valueOfField = fieldInfo.GetValue(mainControl); 
var customControlType = fieldInfo.FieldType; 
var methodInfo = customControlType.GetMethod("Display"); 
methodInfo.Invoke(valueOfField, new object[] {}); 
+0

如果你改變'VAR customControlType = typeof運算(CustomControl);''到VAR customControlType = fieldInfo.FieldType;',它會更普遍 –

+0

@JakubDąbek編輯。 – Sweeper

相關問題