2009-05-05 5 views
4

모든 객체를 허용하는 함수가 있으며 입력으로있는 속성 또는 필드에서 값을 가져옵니다.ComponentModel 및 Reflection 정보

그것은 현재 다음과 같습니다

private string GetFieldValue(object o, Field f) 
{ 
//field.name is name of property or field 
     MemberInfo[] mi = o.GetType().GetMember(field.name, MemberTypes.Field | MemberTypes.Property, 
      BindingFlags.Instance | BindingFlags.Static | BindingFlags.Public | BindingFlags.NonPublic | 
      BindingFlags.ExactBinding); 

     if (mi.Length == 0) throw new ArgumentException("Field", "Can't find member: " + f.name); 

     Object value; 
     if (mi[0].MemberType == MemberTypes.Property) 
      value = ((PropertyInfo)mi[0]).GetValue(o, null); 
     else value = ((FieldInfo)mi[0]).GetValue(o); 

오늘은 내가 System.ComponentModel하고 XXXDescriptor 클래스에 대해 읽어보십시오. 성능이 문제가되는 시점에서 두 프레임 워크 (Reflect & ComponentModel) 사이의 차이점은 무엇입니까? ComponentModel을 사용하여 위의 내용을 다시 작성하면 성능이나 유연성이 향상됩니까? 내가 아는 그 둘 사이의 유일한 차이는 CM에 의한 가상 속성 지원입니다.

Ty.

답변

3

TypeDescriptor ( System.ComponentModel) 캐시가 내부적으로 캐시되므로 더 나은 성능을 제공 할 수 있습니다.하지만 위의 코드에 캐시를 추가하는 것을 막을 수는 없습니다. TypeDescriptor은 리플렉션을 사용하지만 객체를 확장하고 '실제'속성 및 이벤트로 지원되지 않는 속성 및 이벤트를 추가 할 수 있습니다. TypeDescriptor은 필드를 지원하지 않습니다. 내가 당신과 내가, TypeDescriptor '의 확장 기능을 상관하지 않았다 내가 그때 반사와 함께 다루고 싶어요, GetMember의 상단에 자신의 캐시를 추가 할 행복했다 경우

.

편집 : 표준 반사 2.0 이후 MemberInfo 객체를 캐시 한 - MSDN "Using .NET: Avoid Common Performance Pitfalls for Speedier Apps"를 참조하십시오.

+0

TypeDescriptor는 stanadrd 리플렉션보다 훨씬 많은 캐싱을 수행하지 않습니다. 주요 병목 현상이 발생하며 이는 느려집니다. 그러나이 문제를 개선하는 방법에 대한 내 답변을 참조하십시오 (ComponentModel 주변의 맞춤 설정 포함). –

+0

리플렉션은 어셈블리 메타 데이터를 구문 분석하는 반면 TypeDescriptor는 항상 캐시 된 것으로 간주됩니다 (TypeDescriptor 클래스의 MSDN 페이지에는 "Properties 및 이벤트가 TypeDescriptor에 의해 캐시 됨"). –

+0

Reflection은 이미 MemberInfo를 현금으로 바꾸지 않았습니까? MSDN의 : "MemberInfo 캐시가 .NET Framework 2.0에서 느리게 채워집니다. 즉, 작업 집합 비용이 낮고 메서드를 검색하는 데 시간이 덜 걸립니다. 원하는 특정 메서드의 이름을 알고 있으면 -plural GetXX 메서드. " – majkinetor

6

차이점은 ComponentModel은 원시 클래스에 대한 추상화입니다. 즉, 존재하지 않는 속성 을 정의 할 수 있습니다. 실제로는 정확히 DataView/DataRowView이 데이터 바인딩의 속성으로 노출되는 방식입니다. ComponentModel을 사용하면 1.1에서도 "동적"과 같은 것을 얻을 수 있습니다.

아마도 ComponentModel의 속도가 느려질 것입니다. 하지만 실제로는이 추상화를 악용하여 악용 할 수 있습니다. HyperDescriptor 정확히을 사용하여 직접 IL을 작성하여 속성을 나타내며 반사 또는 바닐라 ComponentModel보다 훨씬 빠른 액세스를 제공합니다.

그러나 ComponentModel은 기본적으로 등록 정보 (필드가 아님)로 제한됩니다. 직접 PropertyDescriptor facades를 통해이 작업을 수행 할 수 있지만 좋은 생각은 아닙니다. 또한 ComponentModel에 "쓰기 전용"속성을위한 장소가 많지 않습니다.