2013-09-29 15 views
1

我知道,在類中聲明的訪問修飾符可以在同一個程序集內訪問。C#.NET:使用Type.GetType和Activator.CreateInstance從另一個類訪問的內部類?

然而,在我的情況下另一個組件能夠訪問另一個組件使用Type.GetType內部類,並且還能夠創建其使用Activator.CreateInstance()成功的對象。

我想知道是真的有可能能夠在另一個程序使用Type.GetType()其他組件訪問內部類?如果沒有,那麼我錯過了什麼?


其他細節: 我要指定包含我的領域驅動設計(型號和Infrascture層),它使用三個assmbelies /工程類圖的鏈接:

Figure

對於爲了方便起見,我將解釋關於以上類diagaram的一些信息:

  1. 大多數外部邊界/矩形用於asse mblies/projects 即; A)sharemanagement.model, B)sharemanagement,
    C)sharemanagement.infrastructure.repositories

使得sharemanagement就像核心(或文庫),其由sharemanagement.model和sharemanagement.infrastructure.repositories引用但sharemanagent組件不引用任何這兩個的(因爲sharemanagement是核心/鹼庫/組件在其上的其他組件依賴。

  • 內部矩形矩形是子目錄。
  • 現在,sharemanagement.model請求sharemanagement(使用其repositoryFactory)返回CompanyRepository的一個實例(在Sharemanagement.Infrastructure.Repositories定義),其sharemanagement獲得使用Type.GetType和Activator.CreateInstance()

    而且,雖然創建CompanyRepository(使用Activator.CreateInstance()如上所述)的實例的情況下,基類CompanyRepository的即「SQLRepositoryBase」(在Sharemanagement定義)得到使用Type.GetType(在Sharemanagement.Infrastructure.Repositories定義)EntityFactory的一個實例(來自buildEntityFactory方法內部的)EntityFactoryBuilder類。

    需要注意的要點是,CompanyFactory是內部類,並在程序集「sharemanegement.infrastructure.repositories」中定義,而EntityFactoryBuilder.buildentityFactory()類是在程序集「sharemanagement」中定義的。

    +1

    *「我想知道是否真的有可能在另一個程序集中使用Type.GetType()訪問另一個程序集中的內部類?」*是的,這是可能的。 – I4V

    +0

    通常您可以通過反射訪問其他程序集的內部成員。下面是一個例子:'/ *在mscorlib.dll中獲取內部類的Type對象:*/ 類型internalType = typeof(object).Assembly.GetType(「System.SZArrayHelper」); /*調用私人實例構造函數*/ object szah = Activator.CreateInstance(internalType,true);' –

    回答

    4

    但是,在我的情況下,另一個程序集能夠使用Type.GetType訪問另一個程序集中的內部類,並且還能夠使用Activator.CreateInstance()成功創建它的對象。

    事實上,假設試圖這樣做的代碼具有適當的信任級別。確實,完全可信的代碼可以通過反射來完成各種事情,包括更改私有字段。在減少的信任環境中運行的代碼不能完成這些事情。

    1

    內部實體可能無法在模糊程序集中訪問。