You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

WPF项目使用MVVMToolkit ObservableValidator出现多个重复错误

问题现象
  • 运行环境:基于.NET Core 3.1的WPF项目,引用7.1.2版本的Microsoft MVVM Toolkit
  • 正常场景:继承ObservableObject的类功能运行完全正常
  • 异常场景:项目中只要创建继承自ObservableValidator的类,源生成器自动生成的代码文件就会抛出多个"Duplicate"重复定义错误,错误截图如下:
    ObservableValidator源生成器重复错误截图
  • 触发条件无额外依赖,哪怕是结构极简的测试类也会触发错误,测试类代码如下:
public class Test : ObservableValidator
{
    private decimal _internalProp;
    public decimal ExternalProp
    {
        get { return _internalProp; }
        set { SetProperty(ref _internalProp, value); }
    }
}
报错关联的自动生成代码

错误由源生成器自动生成的以下代码触发:

// Licensed to the .NET Foundation under one or more agreements.
// The .NET Foundation licenses this file to you under the MIT license.
// See the LICENSE file in the project root for more information.
#pragma warning disable
namespace Microsoft.Toolkit.Mvvm.ComponentModel.__Internals
{
    [global::System.CodeDom.Compiler.GeneratedCode("Microsoft.Toolkit.Mvvm.SourceGenerators.ObservableValidatorValidateAllPropertiesGenerator", "7.1.0.0")]
    [global::System.Diagnostics.DebuggerNonUserCode]
    [global::System.Diagnostics.CodeAnalysis.ExcludeFromCodeCoverage]
    [global::System.ComponentModel.EditorBrowsable(global::System.ComponentModel.EditorBrowsableState.Never)]
    [global::System.Obsolete("This type is not intended to be used directly by user code")]
    internal static partial class __ObservableValidatorExtensions
    {
        [global::System.ComponentModel.EditorBrowsable(global::System.ComponentModel.EditorBrowsableState.Never)]
        [global::System.Obsolete("This method is not intended to be called directly by user code")]
        public static global::System.Action<object> CreateAllPropertiesValidator(global::Sid.Models.Test _)
        {
            static void ValidateAllProperties(object obj)
            {
                var instance = (global::Sid.Models.Test)obj;
            }

            return ValidateAllProperties;
        }
    }
}
问题原因

该问题是7.1.2版本MVVM Toolkit源生成器的已知bug:
该版本源生成器的版本标识与实际生成逻辑不匹配,生成代码标注的生成器版本为7.1.0.0,在.NET Core 3.1配套的旧版Roslyn编译器环境下,源生成器缓存逻辑失效,会为同一个ObservableValidator子类重复生成同名的CreateAllPropertiesValidator方法,最终触发重复定义编译错误。

解决方案

按优先级选择以下任意一种方案即可修复:

  • 方案1:将项目引用的Microsoft.Toolkit.MvvmNuGet包升级到7.1.3及以上的7.x稳定版本,该版本已修复对应源生成器bug,升级后清理解决方案、删除bin/obj目录重新生成即可。
  • 方案2:如果暂时无法升级包版本,可在项目.csproj文件中添加如下配置,禁用触发bug的自动生成逻辑:
<PropertyGroup>
  <DisableMVVMToolkitObservableValidatorSourceGenerator>true</DisableMVVMToolkitObservableValidatorSourceGenerator>
</PropertyGroup>

说明:禁用该源生成器不会影响ObservableValidator的任何业务功能,仅会让ValidateAllProperties()方法的执行性能有小幅下降,对绝大多数业务场景无感知。

  • 方案3:检查项目代码,确认不存在手动定义的Microsoft.Toolkit.Mvvm.ComponentModel.__Internals.__ObservableValidatorExtensions类,手动定义同名类也会触发重复定义错误,如有则删除手动编写的对应代码即可。

内容的提问来源于stack exchange,提问作者Rafael Leonardi

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.26 13:48:19