문제

런타임에 속성을 추가하거나 런타임에 속성 값을 변경할 수 있습니까?

도움이 되었습니까?

해결책

속성은 정적 메타 데이터입니다. 어셈블리, 모듈, 유형, 멤버, 매개 변수 및 반환 값은 C#의 일류 개체가 아닙니다 (예 : System.Type 클래스는 단지 유형의 반영된 표현 일뿐입니다). 유형에 대한 속성 인스턴스를 얻고 속성이 쓰기 가능하지만 속성이 유형에 적용되므로 속성에 영향을 미치지 않으면 속성을 변경할 수 있습니다.

다른 팁

이것은 실제로 당신이 정확히 달성하려는 것에 달려 있습니다.

그만큼 System.componentModel.typedescriptor 물건은 유형, 속성 및 객체 인스턴스에 속성을 추가하는 데 사용될 수 있으며 해당 속성을 검색하기 위해 사용해야하는 제한 사항이 있습니다. 해당 속성을 소비하는 코드를 작성하고 해당 한계 내에서 살 수 있다면 확실히 제안합니다.

내가 아는 한, PropertyGrid Control과 Visual Studio Design 표면은 BCL에서 Typedescriptor 물건을 소비하는 유일한 것입니다. 사실, 그것이 그들이 실제로해야 할 일의 절반 정도를하는 방식입니다.

당신은 할 수 없습니다. 하나의 해결 방법은 런타임에 파생 클래스를 생성하고 속성을 추가하는 것일 수 있지만, 아마도 약간의 과잉 일 것입니다.

글쎄, 다르게, 나는 반사를 사용하여 참조하는 기사를 찾았습니다.

다음은 링크입니다. http://www.codeproject.com/kb/cs/dotnetattributes.aspx , 당신은 또한 가능한 접근법에 대해 논의하기 때문에 기사의 맨 아래에있는 몇 가지 의견을 살펴보고 싶을 것입니다.

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

속성은 메타 데이터이며 컴파일 된 어셈블리에서 이진 형식에 저장됩니다 (또한 간단한 유형 만 사용할 수있는 이유).

나는 그렇게 믿지 않는다. 내가 틀렸더라도, 당신이 기대할 수있는 최선은 전체 유형에 추가하는 것입니다. 사례 유형의.

동적으로 추가 할 수있는 것이 필요한 경우 C# 속성이 방법이 아닙니다. XML에 데이터를 저장하십시오. 나는 최근에 속성으로 시작한 프로젝트를 수행했지만 결국 XML로 직렬화로 옮겼습니다.

왜 필요합니까? 속성은 반사를위한 추가 정보를 제공하지만, 원하는 속성을 외부로 아는 경우 필요하지 않습니다.

데이터베이스 또는 리소스 파일에 메타 데이터를 상대적으로 쉽게 저장할 수 있습니다.

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

라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 StackOverflow
scroll top