Можно ли передать аргумент атрибута из производного класса в его базовый класс?
По сути, я пытаюсь установить аргумент атрибута свойства из производного класса.
Как это можно сделать на С++
public class HasHistory<T, string name> { public HasHistory() { History=new History<T>(); } // here's my attribute [BsonElement(name)] public History<T> History { get; protected set; } }
Однако аргументы шаблона, не относящиеся к типу, допустимы в C++, но недопустимы в C#.
Какой неожиданный обходной путь в C#
Я понимаю, что могу сделать свойство виртуальным и добавить атрибут в производный класс. Но тогда я буду вызывать виртуальную функцию в конструкторе, и хотя это может сработать, это плохая практика.
Я действительно хочу сделать этот вызов, потому что я хочу, чтобы конструктор базового класса инициализировал член; это на самом деле весь смысл базового класса.
public class HasHistory<T> { public HasHistory() { // this will be called before Derived is constructed // and so the vtbl will point to the property method // defined in this class. // We could probably get away with this, but it smells. History=new History<T>(); } // here's my property, without an Attribute public virtual History<T> History { protected set; get; } } public class Derived: HasHistory<SomeType> { // crap! I made this virtual and repeated the declaration // just so I could add an attribute! [BsonElement("SomeTypeHistory")] public virtual HasHistory<SomeType> History { protected set; get; } }
Поэтому я полагаю, что не мог бы поместить атрибут в базу и вместо этого поместить его в свойство производного класса, которое использует/реализуется в терминах свойства защищенного базового класса, но это достаточно громоздко, что устраняет любое удобство, полученное при использовании базы класс.
Итак, есть хороший способ сделать это, верно? Верно?
Как переопределить атрибут свойства производного класса, который наследует базовый БЕЗ переопределения свойства в производном классе?
<T, string name>
в общем. - person Chris Sinclair   schedule 15.03.2013string
, тогда ваш атрибут отображал бы[BsonElement(string)]
, что недопустимо для компиляции. - person Kenneth K.   schedule 15.03.2013