簡體   English   中英

從另一個類訪問私有方法

[英]Accessing a private method from another class

我有兩個存儲庫類( RepositoryFactoryBaseRepository )在同一項目中實現不同的接口。 BaseRepository類具有一個私有方法,在其他類中,同樣的實現現在也需要該方法。

我一直在考慮一個可能的替代方案,而不是重復該方法以保持私有性,盡管到目前為止,我找不到一個好的解決方案,因為根據定義,私有方法僅在其自己的類中具有作用域。

使用繼承並將方法更改為“ protected”也不是一種選擇,因為這兩個類在語義上沒有鏈接。 由於返回類型為空,因此無法使用公共屬性來返回方法的結果。

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

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

在C#中無法完成您想做的事情。 最接近的是internal ,它使成員在整個裝配體中可見。 也可以將兩個類設為私有並嵌套在另一個類中,但這並不總是合適的。

從事C#工作的Mads Torgersen對此有以下看法:

我已經看到許多提案試圖解決“類集可訪問性”的概念。 當然,復雜之處在於,與現有的可訪問性不同,尚不存在將其綁定到的自然組(每個人,程序集,派生類,單個類),因此即使使用其他可訪問性修飾符,您仍然需要語法(或其他內容)定義組。

有幾種方法可以對其進行切片。 我沒有看到一個顯然是正確的建議,但是我認為這個問題是相關的,我將與設計團隊一起討論。

來源

可以,但是看起來很尷尬。 這利用了嵌套類能夠訪問包含類中的私有內容的優勢。 但是, 即使有可能,也並不意味着您應該這樣做 如果僅將修飾符更改為internal您將獲得相同的行為,並且由於兩個類耦合在一起,因此將它們運送到同一程序集中是有意義的,因此internal修飾符是正確的答案。

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

            repo.MethodRequiredByRepositoryFactory();

            return repo;
        }
    }

    private void MethodRequiredByRepositoryFactory() { }
}

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM