我有两个存储库类(RepositoryFactory
和BaseRepository
)在同一个项目中实现不同的接口。 BaseRepository
类有一个私有方法,现在在另一个类中也需要,具有相同的实现。
我没有复制方法以保持隐私,而是考虑一种可能的替代方法,尽管到目前为止我找不到一个好的解决方案,因为根据定义,私有方法只在其自己的类中具有范围。
使用继承并将方法更改为“protected”也不是一个选项,因为这两个类没有语义链接。我不能使用公共属性来回馈方法的结果,因为返回类型是void。
答案 0 :(得分:15)
您可以使用反射。这是一个例子:
MethodInfo privMethod = objInstance.GetType().GetMethod("PrivateMethodName", BindingFlags.NonPublic | BindingFlags.Instance);
privMethod.Invoke(objInstance, new object[] { methodParameters });
答案 1 :(得分:8)
不可能在C#中做你想做的事。最接近的是internal
,这使得该成员对整个装配体可见。也可以将这两个类设为私有并嵌套在另一个类中,但这并不总是合适的。
参与C#工作的Mads Torgersen对此有这样的说法:
我已经看到一些提案试图解决一些“类集可访问性”的概念。当然,复杂性是,与现有的可访问性不同,还没有一个自然组(每个人,汇编,派生类,单个类)将它绑定到,所以即使使用另一个可访问性修饰符,您仍然需要语法(或某些东西)来定义小组。
有几种方法可以切片。我没有看到一个明显正确的提案,但我认为问题是相关的,我将与设计团队讨论。
(source)
答案 2 :(得分:4)
你可以,但看起来很尴尬。这利用了嵌套类能够从包含类访问私有东西。但是,即使有可能并不意味着你应该这样做。如果您只是将修改器更改为internal
,则会得到相同的行为,并且由于这两个类耦合在一起,因此将它们放在同一个程序集中是有意义的,因此内部修饰符是正确的答案。
public class BaseRepository
{
public sealed class RepositoryFactory
{
public static BaseRepository Create()
{
var repo = new BaseRepository();
repo.MethodRequiredByRepositoryFactory();
return repo;
}
}
private void MethodRequiredByRepositoryFactory() { }
}