2008-09-16 4 views
1

나는 사용자 정의 핸들러 클래스 (entlib 4 정책 주입 응용 프로그램 블록을 사용하여) 내가 호출이 호출 될 때 입력 방법은 속성인지 알고 싶습니다에 적용 있어요. 다음은 내 처리기가 보이는 것입니다.메소드가 Policy Injection의 속성인지 확인하는 가장 좋은 방법은 무엇입니까?

[ConfigurationElementType(typeof(MyCustomHandlerData))] 
public class MyCustomHandler : ICallHandler 
{ 
    public IMethodReturn Invoke(IMethodInvocation input, GetNextHandlerDelegate getNext) 
    { 
     if (input.MethodBase.IsPublic && (input.MethodBase.Name.Contains("get_") || input.MethodBase.Name.Contains("set_"))) 
     { 
      Console.WriteLine("MyCustomHandler Invoke called with input of {0}", input.MethodBase.Name); 
     } 
     return getNext().Invoke(input, getNext); 
    } 

    public int Order { get; set; } 
} 

당신이 내 코드 샘플, 나는 메소드 이름을 분석하여 지금까지 IS 생각했습니다 최선의 방법에서 볼 수 있듯이. 이것을 할 수있는 더 좋은 방법이 없을까요?

답변

2

는 사실이다.

.method public hidebysig specialname static int32 get_ExitCode() cil managed 
.method public hidebysig specialname static void set_ExitCode(int32 'value') cil managed 

당신은 당신이 할 수 공상을 얻고 싶었다 경우 (예를 들어 Environment.ExitCode를 사용하여) 다음과 같이이 방법이 노출 된 IL 수준에서 (다른 것들 사이) 속성

에 true가됩니다 당신도 사람들이 불쾌한 이름을 사용하여 좋은해야

if (m.IsSpecialName && (m.Attributes & MethodAttributes.HideBySig) != 0)) 

뿐만 아니라 get_ 또는 set_ 시작으로 정직을 제외한 속성이 존재했다 이름을 추출하고 확인합니다 (hidebysig를 날조하는 것은 IsSpecialName을 날조 충분히 쉽게 매우 까다로울 것입니다.)

아무것도하지만 보장하지 않습니다. 누군가 진짜 set 메소드처럼 보이지만 실제로는 읽기 전용 속성에 설정된 것이 아닌 set_Foo 메소드로 클래스를 방출 할 수 있습니다. CanRead/CanWrite 속성도 확인하지 않는 한.

당신이 의도적으로 우회를 기대하지 않습니다하지만 이것은 당신을위한 광기로 저를 친다. 이 논리를 수행 한 간단한 유틸리티/확장 메서드 인 MethodInfo는 너무 어렵지 않고 IsSpecialName을 포함하면 거의 모든 요구를 충족시킬 수 있습니다.

0

당신은 IsSpecialName 속성을 확인할 수 있습니다; 재산 취득자와 세터에게는 사실 일 것입니다. 그러나 연산자 오버로드와 같은 다른 특수 메서드에도 적용됩니다.

0

그 응용 프로그램 블록에 익숙하지 해요,하지만 MethodBase 속성 타입 System.Reflection.MethodBase입니다 가정, 당신은 IsSpecialName 속성을 살펴 수 있습니다. 또한 IsSpecialName을 확인할 수 있습니다

System.Reflection.MethodBase.IsSpecialName on MSDN

0

당신의 부부는 MethodBase 유형의 "IsSpecialName"속성을 사용하여 언급했다. 속성이 "gets"또는 "sets"에 대해 true를 반환하는 것은 사실이지만 add_EventName 또는 remove_EventName과 같은 연산자 오버로드에 대해서도 true를 반환합니다. 따라서 MethodBase 인스턴스의 속성을 확인하기 위해 MethodBase 인스턴스의 다른 속성을 검사해야합니다. 불행히도, 만약 당신이 가진 모든 것이 MethodBase 인스턴스 (Unity 프레임 워크에서 행위를 가로 채는 경우라고 생각합니다)에 대한 참조라면, 속성 설정자인지 게터인지를 결정하는 실제 "깨끗한"방법은 없습니다. 다음과 같이 내가 찾은 가장 좋은 방법은 다음과 같습니다

C 번호 :

bool IsPropertySetter(MethodBase methodBase){ 
    return methodBase.IsSpecialName && methodBase.Name.StartsWith("set_"); 
} 

bool IsPropertyGetter(MethodBase methodBase){ 
    return methodBase.IsSpecialName && methodBase.Name.StartsWith("get_"); 
} 

VB :

Private Function IsPropertySetter(methodBase As MethodBase) As Boolean 

     Return methodBase.IsSpecialName AndAlso methodBase.Name.StartsWith("set_") 

End Function 

Private Function IsPropertyGetter(methodBase As MethodBase) As Boolean 

     Return methodBase.IsSpecialName AndAlso methodBase.Name.StartsWith("get_") 

End Function 
0

그것은 조금 늦게하지만 다른 사람들도 이것을 읽습니다. IsSpecialName과 set_ 접두어를 확인하는 것 외에도 연산자에는 op_, event subscr./remov가 있습니다.add_, remove_가있는 경우) 메서드가 다음과 같은 속성 메서드 중 하나와 일치하는지 확인할 수 있습니다.

bool isProperty = method.ReflectedType.GetProperties().FirstOrDefault(p => 
     p.GetGetMethod().GetHashCode() == method.GetHashCode() 
     || p.GetSetMethod().GetHashCode() == method.GetHashCode())!=null; 
관련 문제