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



我试图编写一个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有什么神奇的吗

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

例子:

  • [Serializable] -成为类型
  • 上的IL标志。
  • [AssemblyVersion] -成为装配标识的一部分
  • [AssemblyFileVersion] -成为文件标识的一部分

原来SerializableAttribute是特殊的,而您需要检查Flags属性:

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

相关内容

  • 没有找到相关文章

最新更新