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

C# 在FxCop自定义规则中检测具有SerializationAttribute的类,c#,.net,fxcop,fxcop-customrules,C#,.net,Fxcop,Fxcop Customrules,我试图编写一个FxCop规则来匹配带有Serializable属性的类,但似乎该属性被忽略了 给定这个示例类 [Serializable] [Description] public class ClassWithSerializableMustHaveSerializableBaseClass : BaseClass { } 我本以为自定义规则中的代码会成功匹配: public override ProblemCollection Check(TypeNode type) {

我试图编写一个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有什么神奇的地方吗?或者我错过了一些明显的东西吗?

事实证明SerializableAttribute是特殊的,您需要检查Flags属性:

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

            Problems.Add(problem);
        }
SerializableAttribute有什么神奇之处吗

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

示例:

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

谢谢Marc-如果我还需要查找其他两个属性,我会记住这一点!