2008-09-24 5 views

답변

63

속성은 정적 메타 데이터입니다. 어셈블리, 모듈, 유형, 멤버, 매개 변수 및 반환 값은 C#의 1 급 개체가 아닙니다 (예 : System.Type 클래스는 형식의 반사 된 표현 일뿐입니다). 유형에 대한 속성의 인스턴스를 가져올 수 있고 쓰기 가능한 경우 속성을 변경하지만 속성이 유형에 적용될 때 속성에 영향을주지는 않습니다.

3

저는 그렇게 생각하지 않습니다. 비록 내가 틀렸다하더라도 당신이 원할 수있는 최선의 방법은 전체 타입에 그것들을 추가하는 것입니다. 결코 타입의 타입이 아닙니다.

+21

TypeDescriptor.AddAttributes (Object, Attribute [])는 대상 구성 요소 인스턴스에 클래스 수준 특성을 추가합니다. –

4

아니요, 그렇지 않습니다.

특성은 메타 데이터이며 컴파일 된 어셈블리에 이진 형식으로 저장됩니다 (그 이유는 단순한 형식 만 사용할 수 있기 때문입니다).

9

수 없습니다. 한 가지 해결 방법은 런타임에 파생 클래스를 생성하고 속성을 추가하는 것일 수 있습니다.하지만 과장 될 수 있습니다.

3

동적으로 추가 할 수있는 무언가가 필요한 경우 C# 속성이 아닙니다. 데이터를 xml에 저장하는 방법을 살펴보십시오. 나는 최근에 내가 속성으로 시작했지만 결국 직렬화 승/xml로 옮긴 프로젝트를 수행했다.

3

왜 필요합니까? 속성은 리플렉션을위한 추가 정보를 제공하지만 원하는 속성을 외부에서 필요로하지 않는다는 것을 외부에서 알고있는 경우

데이터베이스 또는 리소스 파일에 메타 데이터를 외부에 비교적 쉽게 저장할 수 있습니다.

+1

상용구 삭제. 클래스에 자동으로 클래스 내의 코드를 기반으로 특성을 생성하게 할 수 있다면 편리할까요? 나는 SQL CLR 객체에서 보일러 판을 줄이기 위해 이와 같은 것을 알아 내려고하고있다. 다른 언어에서도 쉽게 될 수 있습니다 ... http://www.paulgraham.com/avg.html을보십시오 –

65

이것은 정확히 당신이 달성하고자하는 대상에 달려 있습니다.

stuff는 유형, 속성 및 객체 인스턴스에 속성을 추가하는 데 사용할 수 있으며 해당 속성을 검색하는 데 사용해야한다는 제한이 있습니다. 이러한 속성을 사용하는 코드를 작성하고 이러한 제한 내에서 살 수 있다면 분명히 제안 할 것입니다.

내가 아는 한, PropertyGrid 컨트롤과 Visual Studio 디자인 화면은 TypeDescriptor 항목을 사용하는 BCL의 유일한 요소입니다. 실제로, 그것이 그들이 실제로해야 할 일의 절반 정도를하는 방법입니다.

+5

사실, 대부분의 데이터 바인딩은 'PropertyGrid'뿐만 아니라 'TypeDescriptor'를 사용합니다. –

+1

Silverlight 프로젝트 (TypeDescriptor 및 TypeDescriptionProvider는 구현되지 않음)에 속성 - 메타 데이터 특성을 추가하는 모든 해결 방법 – Shimmy

+0

중요 : TypeDescriptor.GetAttributes()는 중복 특성을 처리하지 않습니다. 속성 유형 .Ext [Attr (1), Attr (2), Attr (3)]'Attr (3)'만이 발견됨 – ohmusama

10

음, 다른 점은 Reflection.Emit을 사용하여 참조하는 기사를 찾은 것입니다.

여기에 링크가 있습니다 : http://www.codeproject.com/KB/cs/dotnetattributes.aspx, 가능한 접근법이 논의되었으므로 기사 맨 아래에있는 의견 중 일부를 살펴볼 수도 있습니다.

+9

런타임시 Reflection.Emit 클래스를 사용하여 속성을 만들 수 있지만 Emit 패키지로 빌드 한 클래스에 바인딩 할 수 있으며 기존 패키지에는 바인딩 할 수 없습니다. – Panos

+0

여전히 좋은 통찰력입니다 –

0

나는 성공없이 System.ComponentModel.TypeDescriptor 매우 열심히 노력했다. 그것이 작동하지 않을 수 있다는 의미는 아니지만 코드를보고 싶습니다.

카운터 부분에서는 일부 특성 값을 변경하려고했습니다. 그 목적을 위해 잘 작동하는 2 개의 함수를 만들었습니다.

 // ************************************************************************ 
     public static void SetObjectPropertyDescription(this Type typeOfObject, string propertyName, string description) 
     { 
      PropertyDescriptor pd = TypeDescriptor.GetProperties(typeOfObject)[propertyName]; 
      var att = pd.Attributes[typeof(DescriptionAttribute)] as DescriptionAttribute; 
      if (att != null) 
      { 
       var fieldDescription = att.GetType().GetField("description", BindingFlags.NonPublic | BindingFlags.Instance); 
       if (fieldDescription != null) 
       { 
        fieldDescription.SetValue(att, description); 
       } 
      } 
     } 

     // ************************************************************************ 
     public static void SetPropertyAttributReadOnly(this Type typeOfObject, string propertyName, bool isReadOnly) 
     { 
      PropertyDescriptor pd = TypeDescriptor.GetProperties(typeOfObject)[propertyName]; 
      var att = pd.Attributes[typeof(ReadOnlyAttribute)] as ReadOnlyAttribute; 
      if (att != null) 
      { 
       var fieldDescription = att.GetType().GetField("isReadOnly", BindingFlags.NonPublic | BindingFlags.Instance); 
       if (fieldDescription != null) 
       { 
        fieldDescription.SetValue(att, isReadOnly); 
       } 
      } 
     } 
관련 문제