2017-12-27 34 views
1

私は照会するのと同じページに配置された次のコードを介して、asp.netコードビハインドクラスのメソッドを見つけることを試みています。リフレクションを通してasp.net webformメソッドを見つける

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

しかし、これは常にnull返し、何より不思議なのは、実行時にthisのタイプは、そのタイプがASP.MyPage_aspxとして示していないMyAssembly.MyPageであるということです。このタイプは何ですか?クラスの背後にある元のコードが表示されないのはなぜですか?どこで見つけるのですか?

どのようにこの問題を解決するためのアイデアですか?

答えて

0

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ファイルおよびアセンブリを格納する場所も設定可能です。

静的メソッドを見つけるには(それはpublicまたはprotectedのいずれかであることが必要)ページからGetMethodドキュメントで見つかった発言をもとに、次のBindingFlag

BindingFlags.FlattenHierarchy 

を追加します。

階層の上にpublicおよびprotectedの静的メンバーを含めるには、BindingFlags.FlattenHierarchyを指定します。継承クラスのプライベート静的メンバーは含まれません。

あなたの呼び出しには少なくともそのBindingFlagを含める必要があります。それ以外にも、InvokeMethod広告公開フラグが必要です。これはあなたのCreate方法が実際にプライベートインスタンスメソッド静的ではないと仮定しない

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

:完全なコールは次のようになります。

+0

Createメソッドはpublicであり、staticは実際にWebMethodですが、提案したフラグでnullを返しています。 – Sisyphus

+0

GetMethodsはすべての正しいメソッドを返すように見えますが、GetMethodは常にnullを返しています。 – Sisyphus

+0

@ Sisyphusには、PublicとInvokeMethodのフラグも必要です。私の更新された答えを見てください。 – rene

関連する問題