通过反射查找asp.net webform方法

问题描述 投票:1回答:1

我试图通过在我查询的同一页面上放置的以下代码通过反射在类后面的asp.net代码中找到一个方法。

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

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

知道如何解决这个问题吗?

c# asp.net reflection webforms
1个回答
0
投票

ASP.NET编译器创建一个继承自Page类的新类。所以它会有类似的东西:

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

生成的代码可以在Temporary ASP.NET Files文件夹中找到,可以在用户配置文件的appdata文件夹中找到,也可以在.Net Framework文件夹中找到,但它也可以配置为存储这些中间CS文件和程序集的位置。

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

BindingFlags.FlattenHierarchy 

基于GetMethod doc中的评论:

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

所以你的电话至少要包含那个BindingFlag。除此之外,您还需要InvokeMethod广告公共标志才能返回该方法。完整的调用应该如下所示:

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

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

© www.soinside.com 2019 - 2024. All rights reserved.