如何将public abstact类的子类限制为同一程序集中的类型,从而允许将受保护的成员键入内部类型

Ken*_*nic 5 c# abstract-class protected internal

这个问题类似于c#内部抽象类,如何隐藏外部使用但我的动机不同.这是场景

我从以下开始:

internal class InternalTypeA {...}

public class PublicClass
{
   private readonly InternalTypeA _fieldA;

   ...
}
Run Code Online (Sandbox Code Playgroud)

上面的编译很好.但后来我决定提取一个基类并尝试编写以下内容:

public abstract class PublicBaseClass
{
   protected readonly InternalTypeA _fieldA;

   ...
}
Run Code Online (Sandbox Code Playgroud)

因此问题是,受保护的成员在程序集外部是可见的,但是是内部类型,因此它不会编译.

手头的问题是如何(或者我可以?)告诉编译器只有与PublicBaseClass相同的程序集中的公共类可以继承它,因此_fieldA不会在程序集之外公开?

或者是否有另一种方法可以做我想做的事情,有一个公共超类和一组公共基类,它们都在同一个程序集中,并使用它们的公共("受保护")代码中的该程序集的内部类型?

到目前为止我唯一的想法是:

public abstract class PublicBaseClass
{
   private readonly InternalTypeA _fieldA;

   protected object FieldA { get { return _fieldA; } }

   ...
}

public class SubClass1 : PublicBaseClass
{
    private InternalTypeA _fieldA { get { return (InternalTypeA)FieldA; } } 
}

public class SubClass2 : PublicBaseClass
{
    private InternalTypeA _fieldA { get { return (InternalTypeA)FieldA; } } 
}
Run Code Online (Sandbox Code Playgroud)

但那就是UGLY!

the*_*oop 5

CLR提供了一个FamilyAndAssembly可访问性,可以执行您想要的操作,但C#中没有使用它的语法.

解决方法是将变量字段设置为内部,并且您必须信任程序集中的代码以不适当地访问它.

您还可以将PublicBaseClass的构造函数设置为内部,因此只有您的程序集才能实例化它.这样,只有你的类可以继承它(即使类本身是公共的)