【发布时间】:2019-01-08 19:34:39
【问题描述】:
我想为我继承的类的属性添加属性(我无法编辑,因为它是生成的)。我试图通过使用“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
}
}
}
如果我在设置“名称”属性后检查源对象,则子对象上似乎同时存在父对象和子对象的“名称”属性,并且仅填充了子对象(见下图)。我假设父对象的属性是副本,因为它在目标对象中为空。我认为这完全是由于使用(或误用)用“new”重新声明属性。
我假设我在这里误用了 new 关键字,但是否有另一种方法可以在无法编辑父类的情况下从子类向基类的属性添加属性?
【问题讨论】:
-
你需要覆盖它。
-
@SLaks 我需要在基类中将其声明为虚拟,但我无法编辑基类。
-
基类精确地密封了属性以防止派生类对其进行更改。你不能改变它是它的设计方式。如果您可以更改它,那将是一个问题。
-
@Servy 我不这么认为。根据C# spec,您可以从派生类中隐藏基类成员。我这样做没有问题,正常访问派生类的值,或者看到我添加到派生类的属性。唯一真正的问题是通过反射访问值的问题。
标签: c# inheritance reflection attributes