gpt4 book ai didi

c# - 为什么我重新实现的方法保留了基类的属性?

转载 作者:太空宇宙 更新时间:2023-11-03 13:04:31 25 4
gpt4 key购买 nike

我有两个类,RichStringRequiredRichString。在 RequiredRichString 中,我使用“new”关键字重新实现了 Value 属性。如果我在 RequiredRichString 上反射(reflect) Value 上的属性,我只会得到 Required,但是在多次测试发布标记之后,AllowHtml仍在生效。

public class RichString
{
[AllowHtml]
public string Value { get; set; }
}

public class RequiredRichString : RichString
{
[Required]
new public string Value { get; set; }
}

简而言之:当我用 new 重新实现 Value 属性时,为什么 ASP.NET 仍然承认 AllowHtml 属性?

最佳答案

如果你设置了标志:

[AttributeUsage(Inherited=true)]

那么这个属性就会被继承。

但是您可以根据需要将 Attribute 子类化,即基类中的 MyAttribute(Enabled = true)MyAttribute(Enabled = false) 在新的实现中。例如……

[AttributeUsage(Inherited=true, AllowMultiple=true, Inherited=true)]
public class MyAttribute : Attribute
{
public bool Enabled { get; set; }

public MyAttribute() { }

public void SomethingTheAttributeDoes()
{
if (this.Enabled) this._DoIt)();
}
}

public class MyObject
{
[MyAttribute(Enabled = true)]
public double SizeOfIndexFinger { get; set; }
}

public class ExtendedObject : MyObject
{
[MyAttribute(Enabled = false)]
public new double SizeOfIndexFinger { get; set; }
}

注意这个答案:How to hide an inherited property in a class without modifying the inherited class (base class)? - 看起来也许你可以通过使用方法覆盖而不是隐藏来实现你想要的。

我能理解为什么您会对 new 属性有不同的看法,但我的理解是 new 是关于提供新的实现,通常以新的存储机制(例如新的支持字段)的形式出现,而不是更改子类的可见接口(interface)Inherited=true promise 子类将继承 Attribute。这是有道理的,或者至少可以说只有取代 Attribute 才能打破这个 promise 。

关于c# - 为什么我重新实现的方法保留了基类的属性?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/31216757/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com