[英]Accessing a private method from another class
我有兩個存儲庫類( RepositoryFactory
和BaseRepository
)在同一項目中實現不同的接口。 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.