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

C#中如何在编译时阻止Source Generators所用partial基类被实例化?

解决方案

编译时阻止实例化的最简方案:设置protected构造函数

在你的partial class ViewModelBase中显式添加一个protected访问修饰符的构造函数,即可在编译阶段直接阻止外部代码实例化该类,同时不影响子类继承和Source Generators的正常工作:

public partial class ViewModelBase : ObservableObject
{
    // 显式定义protected构造函数,禁止外部直接实例化
    protected ViewModelBase() { }

    [ObservableProperty]
    private bool _myBool;

    [RelayCommand]
    private void MyMethod()
    {
        // ...
    }
}

原理说明

  • 默认情况下,未显式定义构造函数的类会自动生成一个public无参构造函数,这是你的partial基类能被实例化的核心原因。
  • 当你定义protected构造函数后,外部代码尝试new ViewModelBase()会直接触发编译错误;而子类继承该基类时,可以正常调用base()访问这个构造函数,完全适配MVVM的继承体系。
  • 该方案完全兼容MVVM Source Generators的代码生成逻辑,不会产生任何冲突。

进阶编译时检查方案

如果需要更严格的代码规范约束,可以采用以下方式:

  • 自定义Roslyn分析器:编写分析器检测代码中是否存在直接实例化ViewModelBase的语句,在编译阶段抛出错误。适合大型团队统一代码规范,但实现成本较高。
  • 代码分析规则配置:利用EditorConfig配合Roslyn内置规则或第三方分析器,配置规则禁止实例化指定基类。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.25 13:49:52