2012-08-10 56 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 });