我试图编写一个FxCop规则,该规则匹配使用Serializable属性进行装饰的类,但似乎忽略了该属性。
EG。给出这个样本类
[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的神奇之处或者我错过了一些明显的东西?
答案 0 :(得分:5)
是否有关于SerializableAttribute
的神奇之处
是;有许多属性实际上并未作为属性嵌入(即不是“自定义”部分)。一些反射API可以欺骗它,使它们看起来在那里,但不是全部,而不是所有的时间(例如,它取决于如何加载程序集)。
示例:
[Serializable]
- 成为[AssemblyVersion]
- 成为装配标识的一部分[AssemblyFileVersion]
- 成为文件标识的一部分答案 1 :(得分:4)
事实证明SerializableAttribute是特殊的,而你需要检查Flags属性:
if ((type.Flags & TypeFlags.Serializable) == TypeFlags.Serializable)
{
var problem = new Problem(GetResolution(type.BaseType.FullName, type.FullName), type.SourceContext);
Problems.Add(problem);
}