모든 객체를 허용하는 함수가 있으며 입력으로있는 속성 또는 필드에서 값을 가져옵니다.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.
TypeDescriptor는 stanadrd 리플렉션보다 훨씬 많은 캐싱을 수행하지 않습니다. 주요 병목 현상이 발생하며 이는 느려집니다. 그러나이 문제를 개선하는 방법에 대한 내 답변을 참조하십시오 (ComponentModel 주변의 맞춤 설정 포함). –
리플렉션은 어셈블리 메타 데이터를 구문 분석하는 반면 TypeDescriptor는 항상 캐시 된 것으로 간주됩니다 (TypeDescriptor 클래스의 MSDN 페이지에는 "Properties 및 이벤트가 TypeDescriptor에 의해 캐시 됨"). –
Reflection은 이미 MemberInfo를 현금으로 바꾸지 않았습니까? MSDN의 : "MemberInfo 캐시가 .NET Framework 2.0에서 느리게 채워집니다. 즉, 작업 집합 비용이 낮고 메서드를 검색하는 데 시간이 덜 걸립니다. 원하는 특정 메서드의 이름을 알고 있으면 -plural GetXX 메서드. " – majkinetor