8

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

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

使用继承并将方法更改为“受保护”也不是一种选择,因为这两个类在语义上没有链接。我不能使用返回方法结果的公共属性,因为返回类型是无效的。

4

4 回答 4

17

您可以使用反射。这是一个例子:

MethodInfo privMethod = objInstance.GetType().GetMethod("PrivateMethodName", BindingFlags.NonPublic | BindingFlags.Instance);
privMethod.Invoke(objInstance, new object[] { methodParameters });
于 2014-09-24T16:22:01.560 回答
9

在 C# 中做你想做的事是不可能的。您可以拥有的最接近的是internal,这使得该成员对整个程序集可见。也可以将这两个类设为私有并嵌套在另一个类中,但这并不总是合适的。

从事 C# 工作的 Mads Torgersen 对此有这样的看法:

我已经看到许多提案试图解决“类集可访问性”的一些概念。当然,复杂之处在于,与现有的可访问性不同,还没有一个自然组(每个人、程序集、派生类、单个类)可以将其绑定,因此即使使用另一个可访问性修饰符,您仍然需要语法(或其他东西)来定义组。

有几种方法可以对其进行切片。我还没有看到明显正确的提案,但我认为问题是相关的,我会与设计团队讨论这个问题。

来源

于 2012-08-10T10:59:34.703 回答
4

你可以,但它看起来很尴尬。这利用了嵌套类能够从包含类访问私有内容的优势。然而,即使某事是可能的,也不意味着你应该去做。如果您只是将修饰符更改为internal您获得相同的行为,并且由于两个类耦合在一起,那么将它们发送到同一个程序集中是有意义的,因此内部修饰符是正确的答案。

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

            repo.MethodRequiredByRepositoryFactory();

            return repo;
        }
    }

    private void MethodRequiredByRepositoryFactory() { }
}
于 2012-08-10T11:03:26.773 回答
0

参考

可以通过使用反射

  1. 在 Visual Studio 中创建控制台应用程序。
  2. 添加 2 个命名空间
    2.1. System
    2.2.System.Reflection
  3. 现在创建一个类,并在该类中创建一个私有方法,如下所示:
于 2021-10-01T07:17:21.717 回答