【问题标题】:DataAnnotations: Visual Studio does not let to override RequiresValidationContext propertyDataAnnotations:Visual Studio 不允许覆盖 RequiresValidationContext 属性
【发布时间】:2012-06-28 10:18:56
【问题描述】:

我试图通过从ValidationAttribute 继承来实现自定义验证属性,但发现了奇怪的事情。
我的自定义属性需要验证上下文,所以我查看了 ValidationAttribute 的 R# 反编译源并看到,我需要在自定义属性类中覆盖它:

public virtual bool RequiresValidationContext
{
  get
  {
    return false;
  }
}

现在有趣的部分 - Visual Studio 2012 不允许我这样做,告诉我没有这样的覆盖属性,尽管在运行项目时,在调试视图中我可以看到该属性。

有趣的是,我在参考路径中看到:

C:\Program Files (x86)\Reference Assemblies\Microsoft\Framework.NETFramework\v4.0\System.ComponentModel.DataAnnotations.dll

但在 R# 反编译文件中的路径不同:

程序集位置:C:\Windows\Microsoft.NET\Framework\v4.0.30319\System.ComponentModel.DataAnnotations.dll

因此,编译器使用与运行时不同的 dll。 因此,我尝试将引用 dll 切换到一个 R# 反编译,但看起来 VS2012 无论如何都用它的版本替换它,在项目文件中它看起来像:

<Reference Include="System.ComponentModel.DataAnnotations" />

因此,项目中没有保存路径。 如果不手动编辑项目,是否有任何解决方案?

顺便说一句,使用 4.5 NET 它可以正常工作,我的意思是它认为 RequiresValidationContext 属性是应该的。

更新:正如他们所说,图片胜过千言万语:

【问题讨论】:

    标签: .net-4.0 data-annotations visual-studio-2012 .net-4.5


    【解决方案1】:

    解决方案很简单,将属性 RequiresValidationContext 添加到 .NET 4.5 中的 ValidationAttribute。由于您正在使用 C# 4.0 进行编码/使用/开发,我怀疑您的目标是 .NET Framework 4.0,并且在该版本中,该属性执行 not exist

    所以你不能覆盖这个属性,因为它不存在。

    【讨论】:

    • 我用屏幕截图更新了问题,在哪里可以看到,目标框架是 4.0,调试视图仍然看到 RequiresValidationContext 属性。另外,我提到的 dll 的两个路径都直接指向框架的 4.0 文件夹?
    • 对我来说,Debugger/QuickWatch 窗口似乎使用了错误的框架版本来显示值。
    • 如果我反编译 C:\Windows\Microsoft.NET\Framework\v4.0.30319\System.ComponentModel.DataAnnotations.dll 我发现有 RequiresValidationContext 属性,反编译器也说这个文件版本是 4.0.0,所以我不太确定,那个调试器是错的。
    • 我也可以使用attribute.GetType().GetProperty("RequiresValidationContext")通过反射访问属性
    • 当我使用 dotPeek 反编译程序集时,该属性未在 ValidationAttribute 上定义。我正在使用带有最新 .NET Framework 4.0 的 Visual Studio 2010。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-05-23
    • 1970-01-01
    • 1970-01-01
    • 2013-01-13
    • 2021-02-18
    • 2021-09-12
    相关资源
    最近更新 更多