C# 通过反射查找asp.net Web表单方法

C# 通过反射查找asp.net Web表单方法,c#,asp.net,reflection,webforms,C#,Asp.net,Reflection,Webforms,我试图在asp.net代码隐藏类中找到一个方法,方法是通过放置在我查询的同一页面上的以下代码进行反射 MethodInfo MyMethod = this.GetType().GetMethod("Create", BindingFlags.Static); 但是它总是返回null,更奇怪的是在运行时this的类型不是MyAssembly.MyPage,该类型显示为ASP.MyPage\u aspx。这是什么类型的?为什么我看不到类类型背后的原始代码?我在哪里找到它 知道如何解决这个问题吗?A

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

MethodInfo MyMethod = this.GetType().GetMethod("Create", BindingFlags.Static);
但是它总是返回
null
,更奇怪的是在运行时
this
的类型不是
MyAssembly.MyPage
,该类型显示为
ASP.MyPage\u aspx
。这是什么类型的?为什么我看不到类类型背后的原始代码?我在哪里找到它


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

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
    }
}
生成的代码可以在临时ASP.NET文件文件夹中找到,可以在用户配置文件的appdata文件夹中,也可以在.NET Framework文件夹中找到,但它也可以配置为存储这些中间CS文件和程序集的位置

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

BindingFlags.FlattenHierarchy 
根据文件中的备注:

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

因此,您的调用至少必须包含BindingFlag。除此之外,还需要InvokeMethod ad Public标志来返回该方法。完整调用应如下所示:

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

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

Create方法是公共的,static实际上是一个WebMethod,但它仍然返回null,并带有您建议的标志。GetMethods似乎返回所有正确的方法,但GetMethod总是返回null,我不知道为什么@Sisyphus您还需要Public和InvokeMethod标志。请参阅我的最新答案。