2

我目前正在开展一个项目,我们想在其中使用Fody PropertyChanged IL 织布器。它似乎工作得非常好,但它对我们内置在 Visual Studio中的FxCop分析做了一些奇怪的事情。

我们启用了CA1062CA2214:前者验证公共方法的参数,后者检查构造函数中对可覆盖方法的调用。

第二个,我们发现是因为我们也在使用 Caliburn.Micro,它提供了一个名为NotifyOfPropertyChangedvirtual 的方法。这是将方法更改为非虚拟的简单修复。

第一个问题要困难得多,而且看似随机。我们从一开始就一直在验证我们的论点,并且在 Fody 之前没有任何 FxCop 分析错误,但是当我通过 NuGet FxCop 添加它时,发现在不应该有任何编织代码的地方发生了变化。我什至查看了 Fody 之前和之后的反编译源代码的差异,并且在根本没有更改方法的地方存在 FxCop 冲突。

所以我的问题是我是否可以以某种方式将 Fody 编织推迟到分析完成之后,或者是否有其他方法可以让 Fody 和 FxCop 很好地交互?

提前致谢

4

1 回答 1

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
    }
}
于 2014-12-12T12:51:44.657 回答