Добавить атрибут к базовому свойству из производного класса - PullRequest
0 голосов
/ 08 января 2019

Я хотел бы добавить атрибуты к свойствам класса, от которого я наследую (который я не могу редактировать, потому что он сгенерирован). Я попытался сделать это, переопределив их в дочернем классе с ключевым словом «new» и добавив атрибут.

Это, казалось, работало, пока я не заметил некоторые проблемы, которые это вызывало, когда размышлял над экземпляром ребенка, и заметил, что свойство не копировалось. Смотрите следующий пример:

namespace ConsoleApp
{
    class Program
    {
        public class BaseClass
        {
            public string Name { get; set; }
        }

        public class ChildClass : BaseClass
        {
            [MyAttribute]
            new public string Name { get; set; }
        }

        static void Main(string[] args)
        {
            var source = new ChildClass();
            source.Name = "foo";

            var target = new ChildClass();
            var properties = typeof(BaseClass).GetProperties();

            foreach(PropertyInfo property in properties)
            {
                var value = property.GetValue(source);
                property.SetValue(target, value);
            }

            Console.WriteLine(target.Name); // Prints nothing
        }
    }
}

Если я проверяю исходный объект после того, как установил свойство «Имя», выясняется, что родительское и дочернее свойства «Имя» существуют для дочернего объекта, и что заполнен только дочерний объект (см. Изображение ниже). Я предполагаю, что свойство родителя в копии является копией, поскольку оно равно нулю в целевом объекте. Я предполагаю, что это все из-за использования (или неправильного использования) повторного выделения свойства с "новым".

Я предполагаю, что неправильно использую новое ключевое слово здесь, но есть ли другой способ добавить атрибут к свойству базового класса из дочернего класса без возможности редактировать родительский класс?

Properties with the same name

1 Ответ

0 голосов
/ 08 января 2019

Можно скрыть свойство, но использовать значение базового свойства:

[MyAttribute]
new public string Name { 
    get => base.Name; 
    set => base.Name = value;
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...