我们有一个自定义属性
[AttributeUsage(AttributeTargets.All, AllowMultiple = true)]
public class CustomDesignerAttribute: Attribute然后我们就有了一个用这个属性修饰的基类
[CustomDesigner(someKey, someValue)]
public class BaseClass然后我们有一个从这个类派生的类,用相同的属性装饰(具有相同的键,不同的值)
[CustomDesigner(someKey, someOtherValue)]
public class ChildClass : BaseClass有没有可能ChildClass不会创建重复的属性,而是覆盖现有键的值(覆盖整个父属性)?如果不是,如果ChildClass没有定义自己的默认值,那么从BaseClass获取默认值的最佳模式是什么?
发布于 2012-05-28 23:43:16
不,无法覆盖现有属性。
属性是附加到对象(程序集、类、方法、变量等)的元数据,因此它们始终保持这种连接。
如果您想在基类中给出一个默认的“行为”,并在一些派生类中覆盖它,您必须检查GetCustomAttributes()返回的所有属性,以便只使用派生最多的属性(列表中的第一个)。
发布于 2012-05-28 23:53:50
使用[AttributeUsage(Inherited=false)]防止派生类继承该属性。
发布于 2017-08-25 16:57:57
我认为这是可以通过以下方式实现的:
1.使用TypeDescriptor
在您的CustomDesignerAttribute中覆盖TypeId
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,在这两种方式下,你都必须遍历属性列表和过滤器。您必须知道这些列表的顺序是什么,如果大多数派生类型先出现,还是相反。
https://stackoverflow.com/questions/10787082
复制相似问题