Fody PropertyChanged мешает FxCop

В настоящее время я работаю над проектом, в котором мы хотели бы использовать Fody PropertyChanged IL weaver. Похоже, он работает фантастически, но делает странные вещи с нашим FxCop встроен в Visual Studio.

У нас есть CA1062 и CA2214 включен: первый проверяет аргументы общедоступных методов, а второй проверяет вызовы переопределяемых методов в конструкторах.

Второй, как мы выяснили, связан с тем, что мы также используем Caliburn.Micro, который предоставляет метод с именем NotifyOfPropertyChanged, который является виртуальным. Это простое исправление изменения метода, чтобы он не был виртуальным.

Первая проблема намного сложнее и кажется случайной. Мы усердно проверяли наши аргументы с самого начала, и у нас не было ошибок анализа FxCop до Fody, но когда я добавил его через NuGet, FxCop увидел изменения в местах, где не должно быть измененного кода для свойства. Я даже посмотрел diff декомпилированного исходника до и после Fody, и там есть конфликты FxCop в тех местах, где методы вообще не менялись.

Итак, мой вопрос заключается в том, могу ли я каким-то образом отложить плетение Фуди до завершения анализа, или есть какой-то другой способ заставить Фуди и FxCop хорошо взаимодействовать?

заранее спасибо


person Devagamster    schedule 09.08.2013    source источник
comment
Я не могу воспроизвести проблему. Не могли бы вы привести пример класса, для которого CA1062, по-видимому, дает осечку?   -  person Nicole Calinoiu    schedule 12.08.2013


Ответы (1)


Пример:

public class Base : INotifyPropertyChanged
{
    public event PropertyChangedEventHandler PropertyChanged;

    protected virtual void OnPropertyChanged(string propertyName)
    {
        var handler = PropertyChanged;
        if (handler != null)
            handler(this, new PropertyChangedEventArgs(propertyName));
    }
}

public class Descendent : Base
{
    public Descendent()
    {
        DetermineDefaultMyPropertyValue();
    }

    public string MyProperty { get; set; }

    private void DetermineDefaultMyPropertyValue()
    {
        MyProperty = "Default value"; 
    }

    protected override void OnPropertyChanged(string propertyName)
    {
        // some property changed logic
    }
}

Это можно решить, изменив автоматически реализуемое свойство, чтобы использовать резервное поле. (Только те, которые установлены при построении объекта.)

public class Descendent : Base
{
    public Descendent()
    {
        DetermineDefaultMyPropertyValue();
    }

    private string _myProperty;
    public string MyProperty {
        get { return _myProperty; }
        set { _myProperty = value; }
    }

    private void DetermineDefaultMyPropertyValue()
    {
        _myProperty = "Default value"; 
    }

    protected override void OnPropertyChanged(string propertyName)
    {
        // some property changed logic
    }
}
person Remco te Wierik    schedule 12.12.2014