繁体   English   中英

在FxCop自定义规则中使用SerializationAttribute检测类

[英]Detecting class with SerializationAttribute in a FxCop custom rule

我正在尝试编写一个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可以欺骗它,使它们看起来在那里,但不是全部,而不是所有的时间(例如,它取决于程序集的加载方式)。

例子:

  • [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);
        }

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM