使用Reflection C#在Private字段中调用公共函数

时间:2017-08-29 10:44:43

标签: c# winforms reflection

我需要访问Private字段中的公共函数。

实施例

 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类中调用Display函数。

但我采用上述方法获得例外。任何人都可以帮我吗?

1 个答案:

答案 0 :(得分:1)

你似乎不太了解反思。要致电Display,您需要执行以下步骤:

  • CustomControl字段设为FieldInfo
  • 使用实例CustomControl
  • 获取mainControl的值
  • 获取Type
  • CustomControl
  • MethodInfo
  • Type获取CustomControl
  • 使用值Display
  • 调用方法CustomControl

您只完成了第一步,然后继续获取您刚刚获得的字段类型,这只是typeof(FieldInfo),然后您尝试从Display获取FieldInfoFieldInfo没有这样的方法。

我已经方便地制作了这段代码,以便每行对应上面的一个步骤。

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[] {});