2008-10-31 4 views
2

는로 C#에서 방법이된다. 속성을 사용한 반사 최적화.

  1. 모든 속성을 통해 루프를 가진 대 그들 (의 특성을 가지고 있으며 속성이 존재하는 경우 다음 확인 클래스의 모든 속성을 가져 오기는

  2. 하는 경우 모든 public, internal 및 Protected 속성을 원하지만 private 속성은 필요하지 않습니다.이 작업을 수행 할 방법을 찾을 수 없습니다. 다음을 수행 할 수 있습니다.

    PropertyInfo [] props = type.GetProperties (BindingFlags.Instance | BindingFlags .Public | BindingFlags.NonPublic)

개인 속성을 얻는 것을 피할 수있는 방법이 있지만 그 밖의 모든 것을 얻는 방법이 있습니까?

+0

사유 재산? 속성의 포인트는 개인 인스턴스 필드를 노출하는 것입니다. 왜 처음에는 사유 재산이 필요한지 잘 모르겠습니다. –

+0

나는 개인 재산을 원하지 않는다. 개인 재산을 보는 것을 피하는 방법에 대한 질문입니다. – leora

답변

1

나는이 중 하나를 할 수있는 방법이 있다고 생각하지 않습니다.

얼마나 많은 유형을 반사시켜야합니까? 그것은 정말로 병목 현상입니까? 유형별로 두 번 이상 수행하지 않아도되도록 결과를 캐시 할 수 있습니까?

1

(2)에 대한 응답 : 문제의 수업/어셈블리 외부에있는 경우 internalprotectedprivate과 동일합니다.

여기에 액세스하려면 이미 완료 한 것처럼 모든 속성을 물어보고 목록을 직접 필터링해야합니다.

2

캐싱 관련 : TypeDescriptor.GetProperties을 통해 속성에 액세스하면 무료로 캐싱됩니다. TypeDescriptor 클래스에는 이와 같은 반사 상황을위한 다른 유용한 유틸리티 메소드가 있습니다. 그러나 public 속성에서만 작동합니다 (아니 protected 또는 internal 회원 및 필드 없음).

+0

TypeDescriptor를 사용한 캐싱은 실제로 상당히 제한적입니다. 그 이유 중 하나는 확장 속성과 같은 시나리오를 처리해야하기 때문입니다. –

2

실제로는 아무 것도 할 수 없습니다. -하지만 데이터를 캐싱하면 덜 할 수 있습니다. - 게으른 인구

static class PropertyCache<T> 
{ 
    private static SomeCacheType cache; 
    public static SomeCacheType Cache 
    { 
     get 
     { 
      if (cache == null) Build(); 
      return cache; 
     } 
    } 
    static void Build() 
    { 
     /// populate "cache" 
    } 
} 

이 그런 다음 PropertyCache.Cache 단지 등 푸에 대한 데이터가 : 일반적인 유틸리티 클래스 예를 들어,이 일을 편리한 방법이 될 수 있습니다. 원한다면 정적 생성자를 사용할 수도 있습니다.