使用用作受保护字段的内部类型

时间:2012-09-19 20:27:47

标签: c# .net

我有一个包含2个公共类的类库,它们继承自抽象类。在抽象类上,我有一个受保护的字段,只能由继承的类访问。用于该字段的类型是内部类的类型。

例如我有:

internal class MyInternalClass
{
    ...
}

public abstract class MyAbstractClass
{
    protected MyInternalClass myField;
}

现在我明白这不会起作用,因为如果派生自MyAbstract类的其中一个类扩展到程序集之外,那么访问myField将是非法的。

我的问题是如何让MyInternalClass保持内部工作(它不应该在程序集外部访问)并允许程序集中的类扩展MyAbstractClass以访问myField?

4 个答案:

答案 0 :(得分:5)

创建MyAbstractClass需要且MyInternalClass实现的公共接口。

这样的东西,所以默认情况下它可以是MyInternalClass但是如果你需要的话会注入新的行为(例如,模拟):

internal class MyInternalClass : IMyInterface
{
}

public interface IMyInterface
{            
}

public abstract class MyAbstractClass
{
    protected IMyInterface myField;

    protected MyAbstractClass(IMyInterface required = null)
    {
        myField = required ?? new MyInternalClass();
    }
}

答案 1 :(得分:0)

你做不到。如果MyAbstractClass来自外部类MyInternalClass,则需要知道。

如果您需要考虑这样的事情,设计可能需要返工。

答案 2 :(得分:0)

制作字段 myField internal protected

您还必须将 MyAbstractClass 设为内部。如果它继承自内部类,则它无法公开。如果类必须是公共的,那么必须有一种方法来解决它:例如,创建一个接口,公开继承类所需的 MyInternalClass 的功能。

答案 3 :(得分:0)

您需要一个指定 protected“和”internal 而不是 protected“或”internal 的关键字。这样的关键字不存在(从C#5.0开始)。他们可以在以后的版本中添加它。

这里有很多线程。例如,question 5596338

ADDITION:现在我想出了这个“解决方案”:

public abstract class MyAbstractClass
{
    protected class AccessMyFieldHelper
    {
        internal MyInternalClass this[MyAbstractClass mac]
        {
            get { return mac.myField; }
            set { mac.myField = value; }
        }
    }
    protected static readonly AccessMyFieldHelper AccessMyField = new AccessMyFieldHelper();

    private MyInternalClass myField;
}

myField现在是private,但通过AccessMyField可以对其进行受保护的访问。由于它是一个索引器,您必须使用方括号[]

你怎么看?这可以做得更漂亮吗?