【问题标题】:Simulating page lifecycle in code在代码中模拟页面生命周期
【发布时间】:2013-02-11 09:28:44
【问题描述】:

我有一个自定义的Control,我在它上面覆盖了OnInit 方法。

更新

看来我需要通过userControl.GetType().GetEvent("Init") 获取Init 事件。但是,该事件的 RaiseMethod 属性是 null,因此我无法通过反射引发该事件。 有什么线索吗?

我使用以下代码加载控件(ReflectionUtil 使用反射调用方法):

        Page p = new Page();
        UserControl userControl = (UserControl)p.LoadControl(path);
        p.Controls.Add((Control)userControl);

        //EventArgs eventArgs = new EventArgs();

        //ReflectionUtil.CallMethod((object)p, "OnInit", (object[])new EventArgs[1] { eventArgs });
        //ReflectionUtil.CallMethod((object)userControl, "OnInit", (object[])new EventArgs[1] { eventArgs });

        //Plain Reflection doesn't work either...
        EventArgs eventArgs = new EventArgs();

        MethodInfo initMethod = userControl.GetType().GetMethod("OnInit");
        initMethod.Invoke(userControl, (object[])new EventArgs[1]
          {
            eventArgs
          });

但是,当我在自定义控件的 OnInit 方法中设置断点时,它不会被调用。 我在这里遗漏了什么吗?非常感谢任何帮助。

【问题讨论】:

  • ReflectionUtil 代码中的错误?它在其他情况下是否有效?
  • 普通的旧反射也不起作用...但是它找不到OnInit 方法或Init 方法...

标签: .net webforms page-lifecycle


【解决方案1】:

OnInit 受到保护,您使用的 GetMethod 重载只会获取公共方法。

您可以使用the overload with the bindingflag NonPublic 来获取受保护的方法。

【讨论】:

  • userControl.GetType().GetMethod("OnInit", BindingFlags.NonPublic) 这也返回 null?
  • 您可能需要像这样组合标志:BindingFlags.Instance | BindingFlags.NonPublic
  • 它仍然返回null。难道Init实际上是一个事件,需要不同的调用方式?
  • 初始化是一个事件。 OnInit 是在其基本实现中提升它的方法。
  • 我现在通过正常反射采用了OnInit 方法,我可以调用它,但是我覆盖的OnInit 方法没有被调用...也没有例外...跨度>
猜你喜欢
  • 2010-12-16
  • 1970-01-01
  • 2023-03-15
  • 1970-01-01
  • 1970-01-01
  • 2011-05-30
  • 2013-02-20
  • 1970-01-01
相关资源
最近更新 更多