2013-08-09 6 views
2

В настоящее время я работаю над проектом, в котором мы хотели бы использовать ткацкий станок Fody PropertyChanged. Кажется, он работает фантастически, но он делает странные вещи для нашего анализа FxCop, встроенного в визуальную студию.Fody PropertyChanged, мешающий FxCop

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

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

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

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

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

+0

Я не могу воспроизвести проблему. Не могли бы вы привести пример класса, для которого CA1062, по-видимому, не срабатывает? –

ответ

0

Пример:

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 
    } 
} 

 Смежные вопросы

  • Нет связанных вопросов^_^