【问题标题】:FxCop hates my usage of MVVMFxCop 讨厌我使用 MVVM
【发布时间】:2011-02-02 03:08:53
【问题描述】:

我刚刚开始与 FxCop 合作,看看我的代码在违反其全套规则时表现如何。我从“打破”规则开始,我遇到的第一个是 CA2227,它基本上说你应该将集合属性的设置器设为只读,这样你就不会意外更改集合数据。

由于我使用的是 MVVM,我发现使用带有 get/set 属性的 ObservableCollection 非常方便,因为它使我的 GUI 更新在代码隐藏中变得简单而简洁。不过,我也可以看到 FxCop 抱怨的内容。

我刚刚遇到的另一种情况是使用 WF,我需要在创建工作流时设置参数,我不想为了避免这种特殊情况而不得不围绕我正在使用的集合编写一个包装类错误信息。

例如,以下是我将属性设置为只读时收到的示例运行时错误消息:

The activity 'MyWorkflow' has no public writable property named 'MyCollectionOfStuff'

您对此有何看法?我可以忽略这个特定的错误,但这可能不好,因为我可以想象在 MVVM 不适用的代码的其他地方(例如,仅模型代码)中违反此规则。我认为我还可以将它从一个属性更改为一个类,其中包含操作基础集合的方法,然后从 setter 方法发出必要的通知。我有点困惑……有人能解释一下吗?

【问题讨论】:

    标签: c# data-binding mvvm fxcop observablecollection


    【解决方案1】:

    这个特定规则告诉我们一个集合属性应该是只读的,因为你不需要将整个集合分配给一个属性。

    例如,想象这样一个类:

    public class Foo
    {
       public ObservableCollection<int> Bar { get; set; }
    }
    

    如果在代码中的某处我有以下行会发生什么:

    var f = new Foo();
    f.Bar = new ObservableCollection<int>();
    f.Bar.AddRange(new int[] { 1, 2, 3, 4 });
    // ...
    // Attaches and handlers to the collection events
    // ...
    f.Bar = new ObservableCollection<int>();
    f.Bar.AddRange(new int[] { 5, 6, 7, 8 });
    

    执行最后两行代码时,不会触发附加的事件处理程序,因为 Bar 属性具有完全不同的对象。

    另一方面,如果属性是只读的,则会触发事件并且一切都会按预期运行。

    【讨论】:

    • 很高兴知道,谢谢你的解释。但是,这对 Windows 工作流情况没有帮助。我将使用特定的运行时错误消息更新我的问题。
    • 为什么不直接忽略这个报告的项目呢?您可以使用 System.Diagnostics.CodeAnalysis.SuppressMessage 属性忽略此类误报。
    • @Lex:我现在正在为那些特定的实例这样做。在一个稍微相关的说明中,我在特定(全局)案例中遇到了 SuppressMessage 问题。你对此有什么建议吗? stackoverflow.com/questions/2542883/…
    • 我也遇到了类似的无法解决的问题。所以最后我放弃了,顺其自然。 :)
    猜你喜欢
    • 1970-01-01
    • 2016-08-24
    • 1970-01-01
    • 1970-01-01
    • 2010-11-19
    • 2018-04-18
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多