런타임에 속성을 추가하거나 런타임에 속성 값을 변경할 수 있습니까?C#에서 속성을 동적으로 추가 할 수 있습니까?
답변
속성은 정적 메타 데이터입니다. 어셈블리, 모듈, 유형, 멤버, 매개 변수 및 반환 값은 C#의 1 급 개체가 아닙니다 (예 : System.Type
클래스는 형식의 반사 된 표현 일뿐입니다). 유형에 대한 속성의 인스턴스를 가져올 수 있고 쓰기 가능한 경우 속성을 변경하지만 속성이 유형에 적용될 때 속성에 영향을주지는 않습니다.
저는 그렇게 생각하지 않습니다. 비록 내가 틀렸다하더라도 당신이 원할 수있는 최선의 방법은 전체 타입에 그것들을 추가하는 것입니다. 결코 타입의 타입이 아닙니다.
아니요, 그렇지 않습니다.
특성은 메타 데이터이며 컴파일 된 어셈블리에 이진 형식으로 저장됩니다 (그 이유는 단순한 형식 만 사용할 수 있기 때문입니다).
수 없습니다. 한 가지 해결 방법은 런타임에 파생 클래스를 생성하고 속성을 추가하는 것일 수 있습니다.하지만 과장 될 수 있습니다.
동적으로 추가 할 수있는 무언가가 필요한 경우 C# 속성이 아닙니다. 데이터를 xml에 저장하는 방법을 살펴보십시오. 나는 최근에 내가 속성으로 시작했지만 결국 직렬화 승/xml로 옮긴 프로젝트를 수행했다.
왜 필요합니까? 속성은 리플렉션을위한 추가 정보를 제공하지만 원하는 속성을 외부에서 필요로하지 않는다는 것을 외부에서 알고있는 경우
데이터베이스 또는 리소스 파일에 메타 데이터를 외부에 비교적 쉽게 저장할 수 있습니다.
상용구 삭제. 클래스에 자동으로 클래스 내의 코드를 기반으로 특성을 생성하게 할 수 있다면 편리할까요? 나는 SQL CLR 객체에서 보일러 판을 줄이기 위해 이와 같은 것을 알아 내려고하고있다. 다른 언어에서도 쉽게 될 수 있습니다 ... http://www.paulgraham.com/avg.html을보십시오 –
이것은 정확히 당신이 달성하고자하는 대상에 달려 있습니다.
stuff는 유형, 속성 및 객체 인스턴스에 속성을 추가하는 데 사용할 수 있으며 해당 속성을 검색하는 데 사용해야한다는 제한이 있습니다. 이러한 속성을 사용하는 코드를 작성하고 이러한 제한 내에서 살 수 있다면 분명히 제안 할 것입니다.
내가 아는 한, PropertyGrid 컨트롤과 Visual Studio 디자인 화면은 TypeDescriptor 항목을 사용하는 BCL의 유일한 요소입니다. 실제로, 그것이 그들이 실제로해야 할 일의 절반 정도를하는 방법입니다.
사실, 대부분의 데이터 바인딩은 'PropertyGrid'뿐만 아니라 'TypeDescriptor'를 사용합니다. –
Silverlight 프로젝트 (TypeDescriptor 및 TypeDescriptionProvider는 구현되지 않음)에 속성 - 메타 데이터 특성을 추가하는 모든 해결 방법 – Shimmy
중요 : TypeDescriptor.GetAttributes()는 중복 특성을 처리하지 않습니다. 속성 유형 .Ext [Attr (1), Attr (2), Attr (3)]'Attr (3)'만이 발견됨 – ohmusama
음, 다른 점은 Reflection.Emit을 사용하여 참조하는 기사를 찾은 것입니다.
여기에 링크가 있습니다 : http://www.codeproject.com/KB/cs/dotnetattributes.aspx, 가능한 접근법이 논의되었으므로 기사 맨 아래에있는 의견 중 일부를 살펴볼 수도 있습니다.
런타임시 Reflection.Emit 클래스를 사용하여 속성을 만들 수 있지만 Emit 패키지로 빌드 한 클래스에 바인딩 할 수 있으며 기존 패키지에는 바인딩 할 수 없습니다. – Panos
여전히 좋은 통찰력입니다 –
자바에서는지도를 사용하고 키 - 값 코딩을 자체적으로 구현하여이 문제를 해결했습니다.
http://developer.apple.com/documentation/Cocoa/Conceptual/KeyValueCoding/KeyValueCoding.html
링크가 끊어짐, 답변을 삭제하십시오 – reggaeguitar
나는 성공없이 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);
}
}
}
- 1. 엔티티 개체에 속성을 동적으로 추가 할 수 있습니까?
- 2. JavaScript를 사용하여 링크에 동적으로 "href"속성을 추가 할 수 있습니까?
- 3. 이 속성을 어떻게 추가 할 수 있습니까?
- 4. 동적으로 콘텐츠를 프레임에 추가 할 수 있습니까?
- 5. WPF에서 동적으로 행을 추가 할 수 있습니까?
- 6. C에서 자동 속성을 초기화 할 수 없습니다.
- 7. Objective-C에서 클래스 속성을 정의 할 수 있습니까?
- 8. Objective-C에서 속성을 배열로 처리 할 수 있습니까? 연로의 CI에서
- 9. Android 매니페스트 속성을 동적으로 변경할 수 있습니까?
- 10. C에서 정수에 부동 소수점 수를 비교하고 추가 할 수 있습니까?
- 11. C에서 구조 - 런타임에 속성을 추가 하시겠습니까?
- 12. C# .NET에서 인터페이스에 변수 및 속성을 추가 할 수 있습니까?
- 13. 어떻게 객체에 새 속성을 추가 할 수 있습니까?
- 14. 어떻게 클래스 속성을 장고 모델에 추가 할 수 있습니까?
- 15. My.Application 또는 My.User에 속성을 추가 할 수 있습니까?
- 16. C#에서 객체에 속성을 추가 할 수 있습니까?
- 17. 코드 숨김으로 GridView에 속성을 추가 할 수 있습니까? 그래서 같은
- 18. inter-type 선언을 사용하여 속성을 추가 할 수 있습니까?
- 19. drools 규칙에 맞춤 속성을 추가 할 수 있습니까?
- 20. MVC 2 DataAnnotation 속성을 기존 속성에 추가 할 수 있습니까?
- 21. maltlab 플롯에 colorbar 속성을 추가 할 수 있습니까?
- 22. 동적으로 속성 속성을 설정하십시오.
- 23. TableCell에 asp : CheckBox 컨트롤을 동적으로 추가 할 수 있습니까?
- 24. Jquery UI 대화 상자에 버튼을 동적으로 추가 할 수 있습니까?
- 25. ASP.NET에서 어떻게 서식 지정 태그를 동적으로 추가 할 수 있습니까?
- 26. 테이블에 행과 셀을 동적으로 추가 할 수 있습니까?
- 27. XAML의 단추에 이벤트를 동적으로 추가 할 수 있습니까?
- 28. 어떻게 컨트롤을 gridview에 동적으로 추가 할 수 있습니까?
- 29. 어떻게 동적으로 ASP.NET MVC RouteTable에 추가 할 수 있습니까?
- 30. 어떻게 Zend_Dojo 폼 요소를 zend_form에 동적으로 추가 할 수 있습니까?
TypeDescriptor.AddAttributes (Object, Attribute [])는 대상 구성 요소 인스턴스에 클래스 수준 특성을 추가합니다. –