가장 좋은 방법은 무엇을 말하는 경우에는 방법은 객실 내에서 정책입니다.

StackOverflow https://stackoverflow.com/questions/73467

문제

나는 사용자 정의 처리에 적용되는 클래스(를 사용하는 정책을 주입 응용 프로그램 블록에서 entlib4)및 알고 싶지 여부를 입력 방법은 재산을 때 호출은 라고 합니다.다음과 같은 내 처리기의 모습입니다.

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

에서 볼 수 있듯이 나의 코드는 샘플는 최선의 방법은 나의 생각은 지금까지에 의해 구문 분석하는 방법 이름입니다.지 않는 더 나은 방법이 있을까요?

도움이 되었습니까?

해결책

도 확인할 수 있습 IsSpecialName 사실입니다.이것이 진정한 속성이(다른 것들 사이에)

에 il 수준 방법들을 통해 노출되어 다음과 같습니다(사용 환경이다.ExitCode 로 예):

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

하고 싶은 경우에는 것을 얻을 수 있는지 확인 후 추출하는 이름을 말한 속성이 존재하지만 정직하기

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

뿐만 아니라 시작 get_ 또는 set_ 다음 당신이 좋아야 한도를 사용하는 사람들을 위해 불쾌한 이름이(날조하 hidebysig 쉽게 충분,날조하 IsSpecialName 것이 매우 까다로운 일이 될)

아무것도 보이지만.수있는 사람이 방출하는 클래스 set_Foo 방법은 보이는 것처럼 실제 설정 방법이지만 실제로 되지 않았 설정에서만 읽을 제공합니다.지 않는 한 당신은 여부를 확인 속성 CanRead/CanWrite 니다.

이 날 파업으로 광기에 대한 당신이지 않는 기대하고 의도적으로 우회.간단한 유틸리티/확장법에 MethodInfo 는 이 논리할 수 있을 것이고 포함 IsSpecialName 것이 거의 확실히 귀하의 모든 요구를 커버.

다른 팁

을 확인할 수 있습 IsSpecialName property;그것은 진실한 시현.그러나,그것은 또한 다른 특별한 방법처럼,오버로드 연산자.

나는 익숙하지 않는 응용 프로그램을 차단하지만,가 MethodBase 객실 유형 시스템입니다.반사입니다.MethodBase 할 수 있습을 살펴 IsSpecialName 을 제공합니다.

시스템입니다.반사입니다.MethodBase.IsSpecialName MSDN

의 몇 가지를 사용하여 언급하는"IsSpecialName"속성의 MethodBase 유형입니다.는 동안 그것은 사실이 반환됩니다 진정한 속성에 대한"얻는"또는"설정",그것은 또한 true 를 반환에 대한 운영자 과부 같은 add_EventName 또는 remove_EventName.그렇게 검사해야 합 다른 특성의 MethodBase 인스턴스를 결정하는 경우 그 속성 접근.불행히도,당신이 참조하는 것입니다 MethodBase 인스턴스(내가 생각하는 경우 차단하는 행동을 통해 프레임워크)있지 않은 실제"깨끗하는"방법을 결정하는 경우 그 속성을 세터 또는 getter.최선의 방법은 내가 찾은 다음과 같습니다:

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

그것은 조금 늦었지만 다른 사람들이 읽을 것입니다.이외에 IsSpecialName 및 확인에 대한 set_ 접두사(운영자가 op_,이벤트를 연결됩니다../remov.는 add_,remove_)확인할 수 있습 방법을의 특성을 같은 방법이:

    bool isProperty = method.ReflectedType.GetProperties().FirstOrDefault(p => 
        p.GetGetMethod().GetHashCode() == method.GetHashCode() 
        || p.GetSetMethod().GetHashCode() == method.GetHashCode())!=null;
라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 StackOverflow
scroll top