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
相关产品推荐
相关产品推荐

