Определение класса с помощью 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);
        }
Другие вопросы по тегам