如何在实现类中实现带internal setter的接口属性
解决接口中public getter + internal setter的实现类声明问题
这其实是个挺常见的接口权限设计匹配问题,咱们结合你的场景一步步来处理:
1. 先确认C#版本要求
首先要注意:接口成员的internal访问修饰符是C# 8.0及以上才支持的特性,所以请确保你的项目语言版本至少设置为8.0(可以在项目属性的“高级”选项里调整)。
2. 实现类的正确属性声明方式
因为你的实现类和接口、工厂都在同一程序集内,直接按照接口的签名来实现属性即可,完全匹配public get + internal set的权限:
public class GenericAuditLogConfig : IAuditLogConfig { // 完全匹配接口的属性签名,自动属性写法最简洁 public int ElementTypeId { get; internal set; } // ...实现接口的其他方法 }
这样写的好处:
- 同一程序集内的工厂类可以正常执行
auditLogConfig.ElementTypeId = elementTypeId;赋值操作 - 外部程序集通过
IAuditLogConfig接口访问时,只能看到get方法,无法修改这个属性,完美符合你的封装需求
3. 带自定义逻辑的进阶写法
如果你的实现类需要在setter里添加额外的校验或处理逻辑,可以手动实现字段和属性:
public class GenericAuditLogConfig : IAuditLogConfig { private int _elementTypeId; // 公开的getter,满足接口要求 public int ElementTypeId => _elementTypeId; // internal的setter,仅同一程序集可访问 internal int ElementTypeId { set { // 这里可以加自定义逻辑,比如校验value的合法性 if (value <= 0) throw new ArgumentOutOfRangeException(nameof(value), "ElementTypeId必须大于0"); _elementTypeId = value; } } // ...其他接口方法实现 }
这种写法适合需要对属性赋值做额外控制的场景,不过如果只是简单的赋值,第一种自动属性的写法足够简洁。
权限验证小提示
你可以做个简单测试:
- 在同一程序集的类里尝试修改
ElementTypeId,会发现完全可行 - 在外部程序集引用该接口,尝试调用
set方法,编译器会直接报错,提示该setter不可访问
内容的提问来源于stack exchange,提问作者awj
相关产品推荐
相关产品推荐

