Asp.net的AutoEventWireup和反射?

时间:2012-11-14 12:51:39

标签: c# asp.net .net .net-4.0 autoeventwireup

AutoEventWireup使用反射page_eventName搜索页面方法

msdn

  

当AutoEventWireup为true时,处理程序会自动绑定到   运行时根据其名称和签名生成的事件。对于每个活动,   ASP.NET搜索根据模式命名的方法   Page_eventname,例如Page_Load或Page_Init。

问题:

他是否为每个请求执行此操作?

我查看了temporary internet files(位于Microsoft.net文件夹...),看看他是否保存了另一个包含显式处理程序附件的文件 - 无法找到任何文件

1 个答案:

答案 0 :(得分:4)

似乎ASP.NET使用缓存,正如@Marc所说。请参阅内部TemplateControl.HookUpAutomaticHandlers

使用dotPeek

的方法的一部分
internal void HookUpAutomaticHandlers()
{
  ...
  object obj = TemplateControl._eventListCache[(object) this.GetType()];
  if (obj == null)
  {
    lock (TemplateControl._lockObject)
    {
      obj = TemplateControl._eventListCache[(object) this.GetType()];
      if (obj == null)
      {
        IDictionary local_1_1 = (IDictionary) new ListDictionary();
        this.GetDelegateInformation(local_1_1);
        obj = local_1_1.Count != 0 ? (object) local_1_1 : TemplateControl._emptyEventSingleton;
        TemplateControl._eventListCache[(object) this.GetType()] = obj;
      }
    }
  }
  ...

私有GetDelegateInformation方法负责为控件创建委托。 TemplateControl._eventListCacheHashtable,每个模板控件都包含代理。

所以,回答你的问题:

  

他是否为每次请求都这样做?

答案是否定的。 ASP.NET会一次填充此Hashtable,然后使用缓存值。