You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何修改单个特性(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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.25 06:22:39