Из UITypeEditor извлеките атрибут, примененный к родителю свойства в .net - PullRequest
0 голосов
/ 21 января 2010

Это не так просто, как говорится в названии, но я надеюсь, что вы понимаете.

Рассмотрим этот сценарий:

Class MyClass

    Property SubProp1
    End Property

    -TypeEditor(whatever)- 
    Property SubProp2
    End Property

End Class

Class MyButton
    Inherits Button

    -MyCustomAttribute-
    Property MC as MyClass
    End Property

End Class

Затем я помещаю экземпляр MyButton в сетку свойств, раскрываю свойство MC и редактирую SubProp2.

В редакторе типов для SubProp2 я хочу получить атрибут, примененный к свойству MC.

Глядя на контекст PropertyDescriptor.ComponentType, мы приходим к типу: MyClass. Если я посмотрю на атрибуты, примененные к MyClass, он вернет только атрибуты, примененные непосредственно к MyClass, а не дополнительный атрибут, примененный к свойству MC.

Я изо всех сил пытаюсь вернуться к MC, чтобы я мог прочитать применяемые там атрибуты. У кого-нибудь есть идеи?

ETA:

Я ответил на это ниже:

Ответы [ 2 ]

1 голос
/ 21 января 2010

Если я посмотрю на атрибуты, примененные к MyClass, он вернет только атрибуты, примененные непосредственно к MyClass, а не дополнительный атрибут, примененный к свойству MC.

Атрибут, добавленный к свойству MC, не «добавляется» к атрибутам, применяемым к классу MyClass. Атрибуты являются статическими метаданными, у вас не будет дополнительного атрибута в MyClass только потому, что свойство типа MyClass имеет этот атрибут. Между ними нет никакой связи.

MyClass не может извлечь атрибуты свойства MC, если вы не извлекаете их непосредственно из класса MyButton, с помощью отражения:

Dim prop As PropertyInfo = GetType(MyButton).GetProperty("MC")
Dim attributes As Attribute() = Attribute.GetCustomAttributes(prop)

Но вы не сможете получить эти атрибуты, используя TypeDescriptor, поскольку он может дать вам только атрибуты, определенные для типа, а не для свойств

0 голосов
/ 05 февраля 2010

На самом деле, в дополнение к моему комментарию к Томасу, это возможно без позднего связывания. Вот как это сделать:

DirectCast(context, GridItem).Parent.PropertyDescriptor.Attributes.

Voila!

...