문제

PropertyInfo.GetValue / SetValue 대신 Reflection.Emit을 사용하라는 지시를 받았습니다. 이 방법이 더 빠르기 때문입니다.하지만 저는 Reflection.Emit의 내용과 이를 사용하여 GetValue 및 SetValue를 대체하는 방법을 실제로 알지 못합니다.누구든지 이것 좀 도와줄 수 있나요?

도움이 되었습니까?

해결책

대안적인 대답; 성능을 원하지만 비슷한 API를 원한다면 하이퍼 드 스크립트; 이것은 사용합니다 Reflection.Emit 아래에 (따라서 당신은 필요하지 않습니다) PropertyDescriptor API, 따라서 사용할 수 있습니다.

PropertyDescriptorCollection props = TypeDescriptor.GetProperties(obj);
props["Name"].SetValue(obj, "Fred");
DateTime dob = (DateTime)props["DateOfBirth"].GetValue(obj);

그것을 활성화하기위한 한 줄의 코드 라인, 모든 캐싱 등을 처리합니다.

다른 팁

동일한 속성을 여러 번 가져오거나 설정하는 경우 유형이 안전한 메서드를 구축하기 위해 무언가를 사용하는 것이 실제로 리플렉션보다 빠릅니다.그러나 나는 다음을 사용하는 것이 좋습니다. Delegate.CreateDelegate Reflection.Emit 대신.올바르게 하는 것이 더 쉬우며 여전히 엄청나게 빠릅니다.

나는 이것을 프로토콜 버퍼 구현에 사용했는데, 이는 이전에 비해 큰 차이를 만들었습니다. PropertyInfo.GetValue/SetValue.다른 사람들이 말했듯이, 가장 간단한 방법이 너무 느리다는 것을 증명한 후에만 이 작업을 수행하십시오.

나는 블로그 게시물 더 자세한 내용은 아래로 내려가기로 결정한 경우 CreateDelegate 노선.

propertyinfo.getValue/setValue를 사용하십시오

성능 문제가있는 경우 PropertyInfo 객체를 캐시합니다 (GetProperty를 반복해서 호출하지 마십시오)

경우에만 반사의 사용은 앱의 성능 병목 현상 (프로파일 러에 표시된대로)을 사용합니다.

만약 당신은 값을 읽고/쓰는 것이 여전히 최악의 병목 현상이라고 절대적으로 확신합니다.

그만한 가치가 있다고 의심합니다. 각 레벨은 코드의 복잡성을 더 많이 증가시켜 성능을 향상시킵니다.

그리고 속성에 대한 런타임 액세스가 성능 병목 현상 인 경우 컴파일 타임 액세스를위한 것이 좋습니다 (일반 및 초성 성능이 동시에 어려운시기입니다).

반사의 목적은 PropertyInfo.get/setValue의 목적과 완전히 다릅니다. 반사를 통해 IL 코드 (예 : 동적으로 컴파일 된 어셈블리로 직접 방출 하고이 코드를 실행할 수 있습니다. 물론이 코드는 귀하의 속성에 액세스 할 수 있습니다.

나는 이것이 결국 PropertyInfo를 사용하는 것이 훨씬 빨라질 것이라고 진지하게 의심하며,이 목적을 위해 만들어지지 않았다. 예를 들어 작은 컴파일러의 코드 생성기로 반사를 사용할 수 있습니다.

반사를 사용하는 것은 너무 "영리한"것 같고 조기 최적화가 될 것입니다. 응용 프로그램을 프로필하고 GetValue/setValue 반사가 병목 현상이라는 것을 알게되면 최적화를 고려할 수 있지만 아마도 ....

라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 StackOverflow
scroll top