2017-12-27 13 views
1

내가 쿼리하는 동일한 페이지에 배치 된 다음 코드를 통해 리플렉션을 통해 클래스 뒤에 asp.net 코드에서 메서드를 찾으려고합니다.리플렉션을 통해 asp.net 웹 폼 메서드 찾기

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

그러나이 항상 null 반환, 무엇을 더 이상한 것은 런타임에 this의 유형이 해당 유형이 ASP.MyPage_aspx으로 표시하지 MyAssembly.MyPage 것입니다. 이 유형은 무엇입니까? 클래스 형식 뒤에 원래 코드가 표시되지 않는 이유는 무엇입니까? 어디에서 찾을 수 있습니까?

이 아이디어를 어떻게 해결할 수 있습니까?

답변

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 
    } 
} 

사용자 프로필의 사용자 APPDATA 폴더 또는 닷넷 프레임 워크 폴더에 하나의 임시 ASP.NET 파일 파일 폴더에서 찾을 수 있습니다 생성됩니다 코드 : 그래서 뭔가를해야합니다 이 중간 CS 파일과 어셈블리를 저장할 위치도 구성 할 수 있습니다.

다음 GetMethod 문서에서 발견 된 발언에 따라 다음에서 BindingFlag

BindingFlags.FlattenHierarchy 

를 추가

정적 방법을 찾으려면 (하지만 공용 또는 보호가 될 필요가있다) 페이지에서 계층 구조의 public 및 protected 정적 멤버를 포함 시키려면 BindingFlags.FlattenHierarchy을 지정하십시오. 상속 된 클래스의 private 정적 멤버는 포함되지 않습니다.

그래서 적어도 BindingFlag를 포함해야합니다. 그 너머에 InvokeMethod 광고 공용 플래그가 있어야 해당 메소드가 반환됩니다.

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

이것은 당신의 Create 방법은 실제로 정적 아닌 개인 인스턴스 메소드 가정 않습니다처럼 전체 호출이 보일 것입니다.

+0

Create 메서드는 public이고 static은 실제로 WebMethod이지만 제안한 플래그로 null을 반환합니다. – Sisyphus

+0

GetMethods가 올바른 모든 메서드를 반환하는 것으로 나타나지만 GetMethod가 항상 null을 반환하는 중입니다. 이유는 확실하지 않습니다! – Sisyphus

+0

@Syyphus 당신은 Public과 InvokeMethod 플래그도 필요합니다. 내 업데이트 답변을 참조하십시오. – rene

관련 문제