回答:
.NETを使用している場合、InternalsVisibleToアセンブリ属性を使用すると、「フレンド」アセンブリを作成できます。これらは、他のアセンブリの内部クラスおよびメンバーへのアクセスが許可されている、厳密に名前が付けられた特定のアセンブリです。
これは、関連するアセンブリを密に結合するため、慎重に使用する必要があります。InternalsVisibleToの一般的な用途は、ユニットテストプロジェクトです。上記の理由により、実際のアプリケーションアセンブリでの使用にはおそらく適していません。
例:
[assembly: InternalsVisibleTo("NameAssemblyYouWantToPermitAccess")]
namespace NameOfYourNameSpace
{
内部クラスの場合は、単独で使用してはなりません。したがって、そのオブジェクトを内部で使用する他のクラスのテストとは別に、実際にそれをテストするべきではありません。
クラスのプライベートメンバーをテストしないように、DLLの内部クラスもテストしないでください。これらのクラスは、一般にアクセス可能ないくつかのクラスの実装の詳細であるため、他の単体テストを通じて十分に活用する必要があります。
内部実装の詳細をテストすると、テストが脆弱になるため、クラスの動作のみをテストしたいという考えです。すべてのテストを中断することなく、クラスの実装の詳細を変更できるはずです。
そのクラスを本当にテストする必要があるとわかった場合は、そもそもそのクラスが内部である理由を再検討する必要があるかもしれません。
文書化の目的で
または、Type.GetType
メソッドを使用して内部クラスをインスタンス化できます
例
//IServiceWrapper is public class which is
//the same assembly with the internal class
var asm = typeof(IServiceWrapper).Assembly;
//Namespace.ServiceWrapper is internal
var type = asm.GetType("Namespace.ServiceWrapper");
return (IServiceWrapper<T>)Activator
.CreateInstance(type, new object[1] { /*constructor parameter*/ });
ジェネリック型の場合、次のように異なるプロセスがあります。
var asm = typeof(IServiceWrapper).Assembly;
//note the name Namespace.ServiceWrapper`1
//this is for calling Namespace.ServiceWrapper<>
var type = asm.GetType("Namespace.ServiceWrapper`1");
var genType = type.MakeGenericType(new Type[1] { typeof(T) });
return (IServiceWrapper<T>)Activator
.CreateInstance(genType, new object[1] { /*constructor parameter*/});