WPF项目使用MVVMToolkit ObservableValidator出现多个重复错误
问题现象
- 运行环境:基于.NET Core 3.1的WPF项目,引用7.1.2版本的Microsoft MVVM Toolkit
- 正常场景:继承
ObservableObject的类功能运行完全正常 - 异常场景:项目中只要创建继承自
ObservableValidator的类,源生成器自动生成的代码文件就会抛出多个"Duplicate"重复定义错误,错误截图如下:
- 触发条件无额外依赖,哪怕是结构极简的测试类也会触发错误,测试类代码如下:
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
相关产品推荐
相关产品推荐

