(런타임 유형에 대한 PropertyInfo
의 구상 서브 클래스) RuntimePropertyInfo
의 구현은 생성 된 대리인이 아마 직접 메소드를 호출하는 반면, 반사 (MethodInfo.Invoke
)를 통해 getter 및 setter 메소드를 호출하여 GetValue
및 SetValue
을 구현합니다. 따라서 질문은 다음과 같이 요약됩니다. RuntimeMethodInfo.Invoke
은 컴파일 된 호출과 비교할 때 왜 느려 집니까?
런타임은 델리게이트를 실행 가능한 원시 코드로 컴파일 할 때 비슷한 일관성, 보안 및 가시성 검사를 수행합니다. 또한 boxing/unboxing 등을위한 코드를 내 보낸다. 그러나 이런 일을 한 번 수행하면 코드가 안전하게 실행될 수있다. 이것에 의해, 실제의 메소드 호출이 매우 싸게 동작합니다 (파라미터를로드 해 메소드 주소에 점프합니다). 반면
은 RuntimeMethodInfo.Invoke
에 대한 모든 호출은 (따라서 GetValue
/SetValue
가) 컨텍스트 이후, 모든 일을 반복 할 필요가 - 매개 변수, 인스턴스 및 반환 형식의 사용 - 알려져 있지 않다. 그리고 이것은 아마도 너무 느린 이유 일 것입니다.
누락 된 부분 : 자신의 속성 호출 대리자를 내 보내면 당연히 boxing/unboxing, ref/out 매개 변수 등을 처리해야합니다.
참고로, 당신은 PropertyInfo.GetGetMethod/PropertyInfo.GetSetMethod 그냥 Delegate.CreateDelegate 수 (물론 대리인을 캐시). – Ani
위임자의 개체 인스턴스를 잠 가야합니다. 'GetValue'와'SetValue' 메소드는 호출 할 때 객체 인스턴스를 취합니다. –
Delegate.CreateDelegate는 열기 및 닫기 인스턴스 대리자 개체를 만들 수 있습니다. – Ani