답변:
이것은 실제로 정확히 달성하려는 것에 달려 있습니다.
System.ComponentModel.TypeDescriptor의 물건은 종류, 특성 및 개체 인스턴스에 속성을 추가하는 데 사용, 그리고 당신이 아니라 그 속성을 검색하는 데 사용해야하는 제한이 될 수있다. 이러한 속성을 사용하는 코드를 작성하고 이러한 제한 내에서 살 수 있다면 분명히 제안 할 것입니다.
내가 아는 한 PropertyGrid 컨트롤과 Visual Studio 디자인 화면은 TypeDescriptor를 소비하는 유일한 BCL입니다. 사실, 그들이 실제로해야 할 일의 절반 정도를하는 방식입니다.
TypeDescriptor
및 TypeDescriptionProvider
구현되지?
[Attr(1), Attr(2), Attr(3)]
만 Attr(3)
발견되었습니다.
글쎄, 그냥 다르기 위해 Reflection.Emit을 사용하여 참조하는 기사를 찾았습니다.
링크는 다음과 같습니다. http://www.codeproject.com/KB/cs/dotnetattributes.aspx , 가능한 접근 방식이 논의되어 있기 때문에 기사 하단의 주석 중 일부를 살펴볼 수도 있습니다.
YourClass
로 YourRuntimeClassWithAttributes
.
YourClass
하려면 런타임 에 속성을 서브 클래스 화하고 원하는 동적으로 생성 된 속성이있는 약간 다른 이름으로 동일한 클래스를 생성 할 수 있으며 다형성은 유형 검사 코드가 여전히 식별 할 수있게합니다 당신의 기본 클래스.
왜 필요한가요? 속성은 리플렉션에 대한 추가 정보를 제공하지만 외부에서 원하는 속성을 알고 있으면 필요하지 않습니다.
메타 데이터를 데이터베이스 나 리소스 파일에 비교적 쉽게 외부 적으로 저장할 수 있습니다.
나는 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);
}
}
}
Java에서는 맵을 사용하고 키-값 코딩에 대한 자체 테이크를 구현하여이 문제를 해결했습니다.
http://developer.apple.com/documentation/Cocoa/Conceptual/KeyValueCoding/KeyValueCoding.html
TypeDescriptor
-뿐만 아니라 사용PropertyGrid
합니다.