向派生类的基础属性添加属性

时间:2019-01-08 19:34:39

标签: c# inheritance reflection attributes

我想将属性添加到我要从中继承的类的属性中(由于它已生成,因此我无法编辑)。我试图通过使用“ 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
        }
    }
}

如果在设置“名称”(Name)属性之后检查源对象,则该子对象上同时存在父级和子级的“名称”(Name)属性,并且仅填充了子级的对象(请参见下图)。我假设其中一个是父对象的属性,因为它在目标对象中为null。我认为这都是由于使用(或滥用)了用“ new”重新声明该属性。

我假设我在这里误用了new关键字,但是还有另一种方法可以从子类向基类的属性添加属性,而不能编辑父类? < / p>

Properties with the same name

1 个答案:

答案 0 :(得分:0)

您可以阴影属性,但使用基本属性的值:

[MyAttribute]
new public string Name { 
    get => base.Name; 
    set => base.Name = value;
}