Определение класса с помощью SerializationAttribute в пользовательском правиле FxCop
Я пытаюсь написать правило 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 или я пропустил что-то очевидное?
2 ответа
Есть ли что-то волшебное в 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);
}