【问题标题】:Detecting class with SerializationAttribute in a FxCop custom rule在 FxCop 自定义规则中检测具有 SerializationAttribute 的类
【发布时间】: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 有什么神奇之处,还是我错过了一些明显的东西?

【问题讨论】:

    标签: c# .net fxcop fxcop-customrules


    【解决方案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);
            }
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多