在 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 规则?