C#.NET:使用Type.GetType和Activator.CreateInstance从另一个类可访问的内部类?

时间:2013-09-29 16:14:19

标签: c# .net-assembly internal gettype

我知道在类上声明的访问修饰符内部使得它可以从同一个程序集中访问。

但是,在我的情况下,另一个程序集能够使用Type.GetType访问另一个程序集中的内部类,并且还能够成功使用Activator.CreateInstance()创建其对象。

我想知道是否真的可以在另一个程序集中使用Type.GetType()来访问另一个程序集中的内部类?如果没有,那么我错过了什么吗?


其他细节: 我将指定一个包含我的域驱动设计(模型和基础层)的类图的链接,它使用三个assmbelies /项目:

Figure

为了方便起见,我将解释有关上述类diagaram的内容:

  1. 大多数外部边界/矩形用于装配/项目 即; A)sharemanagement.model, B)股份管理,
    C)sharemanagement.infrastructure.repositories
  2. 这样共享管理就像核心(或库)一样,由sharemanagement.model和sharemanagement.infrastructure.repositories引用,但是sharemanagent程序集不引用这两者中的任何一个(因为共享管理是核心/基础库/程序集,其他的装配依赖。

    1. 矩形内的矩形是子目录。
    2. 现在,sharemanagement.model请求共享管理(使用其repositoryFactory)返回CompanyRepository的实例(在Sharemanagement.Infrastructure.Repositories中定义),共享管理使用Type.GetType和Activator.CreateInstance()

      获取

      并且,在创建CompanyRepository实例的实例时(使用上面提到的Activator.CreateInstance()),CompanyRepository的基类即“SQLRepositoryBase”(在Sharemanagement中定义)获取EntityFactory的实例(在Sharemanagement.Infrastructure中定义)。存储库)使用Type.GetType(来自buildEntityFactory方法)EntityFactoryBuilder类。

      需要注意的是,CompanyFactory是内部类,在程序集“sharemanegement.infrastructure.repositories”中定义,而EntityFactoryBuilder.buildentityFactory()类在程序集“sharemanagement”中定义。

2 个答案:

答案 0 :(得分:4)

  

但是,在我的情况下,另一个程序集能够使用Type.GetType访问另一个程序集中的内部类,并且还能够成功使用Activator.CreateInstance()创建其对象。

实际上,假设尝试这样做的代码具有适当的信任级别。实际上,完全受信任的代码可以通过反射来做各种事情,包括更改私有字段。在信任度降低的环境中运行的代码无法做到这些。

答案 1 :(得分:1)

模糊处理程序集中可能无法访问内部实体。