在 FxCop 自定义规则中检测具有 SerializationAttribute 的类

Posted

技术标签:

【中文标题】在 FxCop 自定义规则中检测具有 SerializationAttribute 的类【英文标题】:Detecting class with SerializationAttribute in a FxCop custom rule 【发布时间】:2014-07-18 13:02:27 【问题描述】:

我正在尝试编写一个 FxCop 规则来匹配带有 Serializable 属性的类,但似乎该属性被忽略了。

例如。给定这个示例类

[Serializable]
[Description]
public class ClassWithSerializableMustHaveSerializableBaseClass : BaseClass


我原以为我的自定义规则中的这段代码会成功匹配:

    public override ProblemCollection Check(TypeNode type)
    
        if (type.Attributes.Any(a => a.Type.FullName == typeof(SerializableAttribute).FullName))
                        
            var problem = new Problem(GetResolution(), type.SourceContext);

            Problems.Add(problem);
        

        return Problems;
    

但事实并非如此。如果我将匹配类型更改为 DescriptionAttribute,那么它确实有效。 SerializableAttribute 有什么神奇之处,还是我错过了一些明显的东西?

【问题讨论】:

【参考方案1】:

SerializableAttribute 有什么神奇的地方

是的;有许多属性实际上并没有作为属性嵌入(即不是“自定义”部分)。一些反射 API 可以欺骗它,使它们看起来在那里,但不是全部,也不是所有时间(例如,这取决于程序集的加载方式)。

例子:

[Serializable] - 成为类型上的 IL 标志 [AssemblyVersion] - 成为程序集标识的一部分 [AssemblyFileVersion] - 成为文件身份的一部分

【讨论】:

谢谢 Marc - 如果我还需要查找其他两个属性,我会记住这一点!【参考方案2】:

原来 SerializableAttribute 很特殊,你需要检查 Flags 属性:

        if ((type.Flags & TypeFlags.Serializable) == TypeFlags.Serializable)
        
            var problem = new Problem(GetResolution(type.BaseType.FullName, type.FullName), type.SourceContext);

            Problems.Add(problem);
        

【讨论】:

以上是关于在 FxCop 自定义规则中检测具有 SerializationAttribute 的类的主要内容,如果未能解决你的问题,请参考以下文章

Fxcop 自定义规则未显示在 Fxcop GUI 中

使用 SonarQube 自定义 Fxcop 规则

忽略某些特定情况的内置 FxCop 规则。自定义 FxCop 规则?

FxCop 自定义规则在 VS2012 中没有名称(但“官方”规则有名称)

FxCop 自定义规则检查命名空间

将自定义 Fxcop 规则与现有 Fxcop 规则集成