首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >覆盖派生类的自定义属性

覆盖派生类的自定义属性
EN

Stack Overflow用户
提问于 2012-05-28 23:31:50
回答 3查看 8.4K关注 0票数 15

我们有一个自定义属性

代码语言:javascript
运行
复制
[AttributeUsage(AttributeTargets.All, AllowMultiple = true)]
public class CustomDesignerAttribute: Attribute

然后我们就有了一个用这个属性修饰的基类

代码语言:javascript
运行
复制
[CustomDesigner(someKey, someValue)]
public class BaseClass

然后我们有一个从这个类派生的类,用相同的属性装饰(具有相同的键,不同的值)

代码语言:javascript
运行
复制
[CustomDesigner(someKey, someOtherValue)]
public class ChildClass : BaseClass

有没有可能ChildClass不会创建重复的属性,而是覆盖现有键的值(覆盖整个父属性)?如果不是,如果ChildClass没有定义自己的默认值,那么从BaseClass获取默认值的最佳模式是什么?

EN

回答 3

Stack Overflow用户

回答已采纳

发布于 2012-05-28 23:43:16

不,无法覆盖现有属性。

属性是附加到对象(程序集、类、方法、变量等)的元数据,因此它们始终保持这种连接。

如果您想在基类中给出一个默认的“行为”,并在一些派生类中覆盖它,您必须检查GetCustomAttributes()返回的所有属性,以便只使用派生最多的属性(列表中的第一个)。

票数 8
EN

Stack Overflow用户

发布于 2012-05-28 23:53:50

使用[AttributeUsage(Inherited=false)]防止派生类继承该属性。

票数 2
EN

Stack Overflow用户

发布于 2017-08-25 16:57:57

我认为这是可以通过以下方式实现的:

1.使用TypeDescriptor

在您的CustomDesignerAttribute中覆盖TypeId

代码语言:javascript
运行
复制
public override object TypeId
{
     get
     {
         return Key.GetHashCode();
      }
 }

TypeId的基本实现只使用属性类型,因此不涉及任何参数。

然后你就可以使用TypeDescriptor.GetAttributes(typeof(ChildClass)).OfType<CustomDesignerAttribute>()

TypeDescriptor (与GetType().GetCustomAttributes相反)仅根据相同的TypeId返回一个属性。我测试了它,它是与返回的TypeId最匹配的派生属性。

因此,如果您的TypeId表示属性的键,那么当使用TypeDescriptor获取属性时,您可以在派生类上覆盖它!注意,仍然可以有多个属性,只要它们的键不同即可。

注意: TypeDescriptor还会查找动态添加的属性(在运行时添加)

2.使用删除属性

您可以在您的CustomDesignerAttribute中添加一个公共bool Remove { get; set; }。可以在派生类中将其设置为true,同时将其他参数设置为与要移除的基类属性相同的参数。然后向派生类添加另一个具有相同键但需要的值的属性。在获取属性时,您必须以一种聪明的方式计算Remove属性。无论是像1)中那样使用TypeDescriptor与TypeId一起使用,例如返回Key.HashCode() + Value.GetHashCode()或使用GetType().GetCustomAttributes,在这两种方式下,你都必须遍历属性列表和过滤器。您必须知道这些列表的顺序是什么,如果大多数派生类型先出现,还是相反。

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/10787082

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档