通过反射查找ASP.NET WebForm方法



我试图通过放置在同一页面上的以下代码来查询的ASP.NET代码中的ASP.NET代码中的方法。

MethodInfo MyMethod = this.GetType().GetMethod("Create", BindingFlags.Static);

但这总是返回null,更奇怪的是,在运行时,this的类型不是MyAssembly.MyPage,该类型显示为ASP.MyPage_aspx。这类型是什么?为什么我没有看到班级类型背后的原始代码?我在哪里找到它?

任何想法如何解决此问题?

asp.net编译器创建一个从您的页面类继承的新类。因此,它将具有类似的东西:

namespace ASP
{
    [CompilerGlobalScope]
    public class MyPage_aspx : MyPage, IHttpHandler
    {
        // all methods that resulted from parsing your ASPX page
        // Build controls, write literal text, etc
    }
}

生成的代码可以在您的用户配置文件的AppData文件夹中或.NET Framework文件夹中找到临时ASP.NET文件文件文件夹,但也是可配置的它将在哪里存储这些中间CS文件和组件。

从页面中找到静态方法(但需要公开或受保护)添加以下bindingflag

BindingFlags.FlattenHierarchy 

基于getMethod文档中的备注:

指定BindingFlags.FlattenHierarchy包括公共和受保护的静态成员层次结构;不包括继承类中的私人静态成员。

因此,您的呼叫至少将包含该绑定。除此之外,您还需要InvokeMethod广告公共标志才能返回该方法。完整的电话应该看起来像:

var MyMethod = this.GetType().
      GetMethod(
          "Create", 
          BindingFlags.Static | 
          BindingFlags.FlattenHierarchy | 
          BindingFlags.InvokeMethod | 
          BindingFlags.Public);

这确实假定您的Create方法确实是静态的,而不是私人实例方法。

最新更新