我试图编写一个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);
}