C# 将属性添加到派生类的基属性

C# 将属性添加到派生类的基属性,c#,inheritance,reflection,attributes,C#,Inheritance,Reflection,Attributes,我想将属性添加到我从中继承的类的属性中(我无法编辑该类,因为它是生成的)。我试图通过在子类中使用“new”关键字重新说明它们并添加属性来实现这一点 这似乎是可行的,直到我在思考孩子的一个实例时注意到它引起的一些问题,并注意到该属性没有被复制。请参见以下示例: namespace ConsoleApp { class Program { public class BaseClass { public string Name {

我想将属性添加到我从中继承的类的属性中(我无法编辑该类,因为它是生成的)。我试图通过在子类中使用“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关键字,但是有没有其他方法可以在不编辑父类的情况下从子类向基类的属性添加属性?


您可以对属性进行阴影处理,但要使用基本属性的值:

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

您需要重写它。@SLaks我需要在基类中将它声明为虚拟,但我无法编辑基类。基类精确地密封了该属性,以防止派生类对其进行更改。你不能改变它的设计方式。如果你能改变它,那将是一个问题。@Servy我认为不是这样的。根据,您可以从派生类隐藏基类成员。这样做没有问题,正常地从派生类访问值,或者查看添加到派生类的属性。唯一真正的问题是通过反射访问值的问题。