2012-08-10 83 views
6

訪問的私有方法,我有兩個倉庫類(RepositoryFactoryBaseRepository)實現同一個項目中的不同接口。 BaseRepository類有一個私有方法,現在也需要在另一個類中使用,方法相同。從另一個類

而不是複製,以保持私營,我在想另外一個可能的方法,但到目前爲止,我無法找到一個很好的解決方案,因爲根據定義的私有方法只能在自己的類有範圍。

使用繼承和改變的方法來「保護」也將不是一個選擇,因爲這兩個類不是語義上的聯繫。由於返回類型是無效的,我不能使用公共屬性返回方法的結果。

+8

他們在同一個項目; 「內部」不夠嗎? – 2012-08-10 10:49:45

+0

所以,你的意思是'RepositoryFactory'構建'BaseRepository'的各種後裔,你想廠通過私有方法做對象上的東西,返回之前? – 2012-08-10 10:51:02

+1

如果你想讓它可以從其他類訪問,你不能使用'private'。 – 2012-08-10 11:01:43

回答

7

這是不可能做到在C#想要什麼。您可以最近的是internal,這使得該成員對整個組件可見。也可以將這兩個類私有化並嵌套在另一個類中,但這並不總是合適的。

的Mads託格森,誰在C#的作品,有這樣一段話吧:

我已經看到了一些建議,試圖用一些概念來格鬥「類設置可訪問性。」當然複雜的是,與現有的可訪問性不同,還沒有一個自然的組(每個人,程序集,派生類,單個類)來綁定它,所以即使使用另一個可訪問性修飾符,您仍然需要語法(或其他)定義組。

有幾種方法來切它。我還沒有看到一個顯然是正確的提案,但我認爲這個問題是相關的,我會把這個提交給設計團隊。

source

+0

如何從具有受保護方法的相同基類中派生它們?或讓他們實現相同的接口並將mehod轉換爲該接口上的專用擴展方法? – mtijn 2012-08-10 11:02:48

+0

@mtijn OP說這是不可接受的 – 2012-08-10 11:04:21

+0

@mtijn你不能真的做出這樣的私人擴展方法。 (如果你想出了一個辦法,請張貼它!) – 2012-08-10 11:06:57

3

你可以,但它看起來很笨拙。這利用嵌套類可以訪問包含類中的私人內容。但是,即使有可能,並不意味着您應該這樣做。如果您只是將修改器更改爲internal,您會得到相同的行爲,並且由於這兩個類耦合在一起,因此將它們裝入相同的裝配體中是有意義的,因此內部修飾符是正確的答案。

public class BaseRepository 
{ 
    public sealed class RepositoryFactory 
    { 
     public static BaseRepository Create() 
     { 
      var repo = new BaseRepository(); 

      repo.MethodRequiredByRepositoryFactory(); 

      return repo; 
     } 
    } 

    private void MethodRequiredByRepositoryFactory() { } 
} 
10

您可以使用反射。這裏有一個例子:

MethodInfo privMethod = objInstance.GetType().GetMethod("PrivateMethodName", BindingFlags.NonPublic | BindingFlags.Instance); 
privMethod.Invoke(objInstance, new object[] { methodParameters });