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

如何在实现类中实现带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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.11 08:20:35