C#内部getter,带有内部类参数的受保护setter

时间:2010-01-07 19:10:28

标签: c# access-modifiers

我遇到了想要一个属性拥有内部getter和受保护的setter的问题,如this question中所述,我认为通过执行以下操作解决了这个问题:

public class Accessor : AccessorBase
{
    private Connection _connection;

    protected void setConnection(Connection value)
    {
        _connection = value;
    }

    internal Connection GetConnection()
    {
        return _connection;
    }
    ...
}

但是,我现在收到此错误:

  

可访问性不一致:参数类型“连接”比方法“setConnection(连接)”更难访问

这是因为我有internal class Connection。我宁愿不让Connection成为公共类,而Accessor 需要是公开的,那么如何在保持内部getter和受保护的setter的同时解决这个错误?

7 个答案:

答案 0 :(得分:9)

不幸的是,C#不支持“内部受保护”访问修饰符(仅支持“内部受保护”),这意味着任何{{1成员在程序集外部可见,不能使用内部类型 使用protected代替internal将是最合理的解决方案。

你可以vote at Microsoft Connect以便它可能会在某一天被添加到C#中。

更新:从C#7.2起,您可以使用private protected

答案 1 :(得分:5)

创建内部IConnection对象实现的公共接口Connection。让您的GetConnectionSetConnection方法接受并返回IConnection而不是Connection

基本SOLID原则再次获胜。

答案 2 :(得分:2)

  

......任何受保护的成员都可见   在组装之外,不能使用   内部类型。

- Pent Ploompuu's answer

解决这个问题的一种方法是使Connection公开,同时使其所有实例方法和构造函数都在内部。

答案 3 :(得分:1)

如果类Connection是内部的,则派生Accessor的类将无法调用受保护的setConnection,因为它无权访问Connection。

如果要保护setConnection,则必须公开Connection。

答案 4 :(得分:0)

抱歉,如果您需要准确的设置,则需要公开Connection课程。

答案 5 :(得分:0)

你不能那样做。由于Connection是内部的,因此来自另一个程序集的Accessor的某个类将无法看到Connection,即使您将setter标记为protected internal它也不会解决任何问题。

你唯一的希望就是让班级公开。

答案 6 :(得分:0)

Coincoin is correctAccessor是任何人都可以从中派生的公共类,这也意味着来自不同的程序集。该派生类现在具有需要传递内部(来自另一个程序集)类的受保护方法。这永远不会奏效。

您需要将Accessor内部公开或Connection公开,或者更好地关注Randolphos answer

以下是问题的代码示例

装配1

//this class is only visible in Assembly 1
internal class Connection
{

}
public class Accessor
{
   protected void SetConnection(Connection con) { }
}

装配2 - 参考装配1

//possible because Accessor is public
DerivedAccessor : Accessor
{
   void SomeMethod()
    {
        this.SetConnection(????) // you can't pass Connection, its not visible to Assembly2 
    }
}