C# добавляют пользовательские атрибуты для свойства родителя в наследованном классе

Я отображаю Бизнес-объект в универсальном DataGrids, и я хочу установить заголовок столбца через пользовательский атрибут, как:

class TestBo
 {
    [Header("NoDisp")]
    public int ID {get; set;}

    [Header("Object's name")]
    public String Name { get; set; }
}

Пока неплохо, но я также хотел бы разделить свой дисплей от моих данных наследованием:

class TestBO
{
   public int ID {get; set;}
   public String Name { get; set; }
}

class TestPresentationBO : TestBO
{
  //Question: how to simply set the Header attribute on the different properties?
}

Я вижу решение через отражение с SetCustomAttribute в Дочернем конструкторе, но это будет громоздким, так там простой и изящный прием для этой проблемы?

Препятствуйте тому, чтобы я повредил разделение данных/презентации; o)

7
задан Vinzz 1 March 2010 в 11:02
поделиться

5 ответов

Просто подумайте, не можете ли вы решить эту проблему с помощью частичные классы и MetadatatypeAttribute ? MVC2 использует этот шаблон для проверки модели.

2
ответ дан 6 December 2019 в 11:48
поделиться

Сделайте свойства в TestBo виртуальными и переопределите их в TestPresentationBO . Таким образом вы можете добавить атрибуты.

4
ответ дан 6 December 2019 в 11:48
поделиться

Вы можете сделать это как WCF RIA Services. Добавьте атрибут в TestBO, например [Presentation], принимая тип в качестве параметра. Этот новый тип переопределит свойства, но с атрибутами представления. Во время выполнения вы должны получить идентификатор нового типа и получить настраиваемые атрибуты его свойств.

Или забудьте об атрибуте и используйте словарь, отображающий BO с классом BO представления. Этот класс BO представления делает то же самое, что и выше, то есть переопределяет свойства с помощью настраиваемых атрибутов.

экземпляр класса BO презентации никогда не создается, он просто отражается, чтобы получить информацию о презентации.

2
ответ дан 6 December 2019 в 11:48
поделиться

Используете ли вы шаблон MVVM (модель представление представление-модель)? Мне кажется, и частично из других ответов, что вы действительно не можете сделать это с настраиваемыми атрибутами, как вы хотите. Но мне также кажется, что ваш TestPresentationBO действительно похож на «модель просмотра» для TestBO . Модель представления - это, по сути, своего рода оболочка или суррогат для бизнес-класса или логического класса, а это в основном то, что вам нужно. (Это краткое изложение модели представления может быть неточным на 100%; я сам только начинаю с MVVM.)

Вы можете создать TestBOViewModel , чтобы обернуть TestBO , затем передать коллекцию TestBOViewModel в сетку данных. Конечно, вы можете украсить свойства, отображающие обернутый класс, с помощью [Header («Имя объекта»)] и т. Д. Это не использует наследование, но я не понимаю, почему вам нужно использовать наследование в этой ситуации.Однако при использовании модели представления ваша презентация (представление) четко отделяется от данных (модели) с помощью оболочки (модели представления).

Для получения дополнительной информации о шаблоне MVVM я нашел это интересным прочтением: Приложения WPF с шаблоном проектирования Model-View-ViewModel .

Что-то вроде этого. Конечно, вы также можете добавить сюда проверку и другие полезности.

public class TestBOViewModel // extend from DependencyObject 
{                            // if you want to use dependency properties

    private TestBO _myBO;

    public TestBOViewModel(TestBO bo)
    {
        _myBO = bo;
    }

    [Header("NoDisp")]
    public int ID 
    {
        get { return _myBO.ID; }
        set { _myBO.ID = value; }
    }
}
2
ответ дан 6 December 2019 в 11:48
поделиться

Вопрос: как просто установить атрибут заголовка для различных свойств?

Невозможно установить атрибут на унаследованном элементе так, как вы предложили, поскольку атрибуты относятся к типу. SetCustomAttribute вам не поможет - он полезен только тогда, когда вы создаете новые типы во время выполнения . После того, как атрибут был скомпилирован, вы не можете изменить его во время выполнения, поскольку он является частью метаданных.

Если вы хотите сохранить разделение, вам придется найти другой способ.

(Вы можете сделать свойства виртуальными, переопределить их в классе Presentation и добавить атрибуты к переопределениям, но это выглядит хитроумно и на самом деле ничего не разделяет - вы все равно получите полный класс TestBO в своем TestPresentationBO .. .)

7
ответ дан 6 December 2019 в 11:48
поделиться
Другие вопросы по тегам:

Похожие вопросы: