从另一个类访问私有方法

时间:2012-08-10 10:46:10

标签: c#

我有两个存储库类(RepositoryFactoryBaseRepository)在同一个项目中实现不同的接口。 BaseRepository类有一个私有方法,现在在另一个类中也需要,具有相同的实现。

我没有复制方法以保持隐私,而是考虑一种可能的替代方法,尽管到目前为止我找不到一个好的解决方案,因为根据定义,私有方法只在其自己的类中具有范围。

使用继承并将方法更改为“protected”也不是一个选项,因为这两个类没有语义链接。我不能使用公共属性来回馈方法的结果,因为返回类型是void。

3 个答案:

答案 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() { }
}