gpt4 book ai didi

c# - 使用 CodeContracts 强制正确实现 INotifyPropertyChanged - "requires unproven"

转载 作者:太空狗 更新时间:2023-10-29 23:19:26 27 4
gpt4 key购买 nike

我正在寻找一种简单的方法来强制执行 INotifyPropertyChanged 的​​正确实现,即当 PropertyChanged 被引发时,它必须引用实际定义的属性。我尝试使用 Microsoft 的新 CodeContract 工具执行此操作,但我不断收到警告“CodeContracts:需要未经证实”。这是我的代码...

public sealed class MyClass : INotifyPropertyChanged
{
private int myProperty;
public int MyProperty
{
get
{
return myProperty;
}
set
{
if (myProperty == value)
{
return;
}

myProperty = value;
OnPropertyChanged("MyProperty");
}
}

private void OnPropertyChanged(string propertyName)
{
Contract.Requires(GetType().GetProperties().Any(x => x.Name == propertyName));

var handler = PropertyChanged;
if (handler != null)
{
handler(this, new PropertyChangedEventArgs(propertyName));
}
}

public event PropertyChangedEventHandler PropertyChanged;
}

有什么方法可以让它发挥作用吗?

最佳答案

好的,首先,为此我个人使用了 MVVM foundation 中的 ObservableObject 实现。 .这是一个仅 DEBUG 构建的运行时检查,几乎与您的相同。

public event PropertyChangedEventHandler PropertyChanged;

protected virtual void OnPropertyChanged(string propertyName)
{
this.VerifyPropertyName(propertyName);

PropertyChangedEventHandler handler = this.PropertyChanged;
if (handler != null)
{
var e = new PropertyChangedEventArgs(propertyName);
handler(this, e);
}
}

[Conditional("DEBUG")]
[DebuggerStepThrough]
public void VerifyPropertyName(string propertyName)
{
// Verify that the property name matches a real,
// public, instance property on this object.
if (TypeDescriptor.GetProperties(this)[propertyName] == null)
{
string msg = "Invalid property name: " + propertyName;

if (this.ThrowOnInvalidPropertyName)
throw new Exception(msg);
else
Debug.Fail(msg);
}
}

这可能是最简单的方法,但它有一些缺点:你需要能够从一些基类继承,它只能在运行时工作(尽管这在我的 wpf 经验中总是足够的),它看起来确实像缺少静态检查的“补丁”。

对于这种情况,您可以通过多种方式启用静态分析/静态工具:

  1. 正如马克所说,use lambda notation and extract string in run-time .
  2. Write a custom FxCop rule .
  3. Use an AOP tool to post-process code带有一些元标记。

至于CodeContracts,我认为它还不够成熟,无法在静态分析中处理这种检查。想象一下,它必须解析您的 lambda,了解它如何因错误的 propertyName 而失败,找到对此方法的所有调用,找出所有可能的输入,等等。它只是一个错误的工具一种支票。

关于c# - 使用 CodeContracts 强制正确实现 INotifyPropertyChanged - "requires unproven",我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/1621921/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com