如何修改单个特性(Attribute)的继承行为?以JsonObject为例
解决单个特性使用时的继承性调整问题
这个需求很贴合实际开发场景,直接给结论:没办法直接修改已定义特性(比如默认继承的JsonObjectAttribute)在单个使用场景下的继承行为——因为特性的继承规则是在它的AttributeUsage元数据里固定死的,一旦特性类定义时设置了Inherited = True,所有使用该特性的地方都会遵循这个规则,没有办法在贴特性的临时修改这个参数。
不过你想到的自定义继承特性的思路完全可行,这是目前最合理的解决方案。具体实现起来很简单,只需要继承原有的JsonObjectAttribute,然后在子类上设置自己的AttributeUsage,把Inherited改成false就行:
// 自定义不继承的JsonObject特性 [AttributeUsage(AttributeTargets.Class | AttributeTargets.Struct, Inherited = false)] public class NonInheritedJsonObjectAttribute : JsonObjectAttribute { // 复用父类的构造函数,保持功能一致 public NonInheritedJsonObjectAttribute(MemberSerialization memberSerialization) : base(memberSerialization) { } // 如果需要支持无参构造,也可以加上 public NonInheritedJsonObjectAttribute() : base() { } }
之后,当你需要让某个类的JsonObject特性不被子类继承时,就用[NonInheritedJsonObject(MemberSerialization.OptIn)],而其他需要保持继承的场景,继续用原来的[JsonObject(MemberSerialization.OptIn)]就行。
这种方式既保留了原特性的所有功能,又实现了“个别调整继承性”的需求,完全符合.NET特性的设计逻辑。
内容的提问来源于stack exchange,提问作者crenshaw-dev
相关产品推荐
相关产品推荐

