가장 좋은 방법은 무엇을 말하는 경우에는 방법은 객실 내에서 정책입니다.
-
09-06-2019 - |
문제
나는 사용자 정의 처리에 적용되는 클래스(를 사용하는 정책을 주입 응용 프로그램 블록에서 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 을 제공합니다.
의 몇 가지를 사용하여 언급하는"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;