我们怎样才能将私有类函数或方法调用到C#中的其他类?

时间:2017-05-29 12:08:32

标签: c# oop

我有一个私有静态类,我试图从SomePrivateClass访问AddtwoNum()方法到C#中的SomePublicClass,并且不允许我这样做。

class SomeClass
{
    private static class SomePrivateClass
    {
        public static void AddtwoNum(int num1, int num2)
        {
            //do some stuff here
        }          
    }
    class SomePublicClass
    {
        SomePrivateClass.AddtwoNum(); //Error: The name AddtwoNum does not exist in the current context.

        // how to call AddtwoNum() method here???
    }
} 

3 个答案:

答案 0 :(得分:1)

您可以使用Reflection来做到这一点,但我宁愿避免调用私有成员,因为它打破了封装并依赖于内部实现细节。这会使你的代码不那么稳定。

您的代码可能如下所示:

  1. 使用Assembly.GetType
  2. 获取您感兴趣的类型
  3. 使用Type.GetMethod
  4. 获取您要执行的方法信息
  5. 使用MethodInfo.Invoke
  6. 调用给定对象上的方法

    代码看起来像这样:

    [TestMethod]
    public void TestMethod1()
    {
        var type = Assembly.GetExecutingAssembly().GetType("ClassLibrary2.SomeClass");
        var nestedType = type.GetNestedType("SomePrivateClass", BindingFlags.NonPublic);
        var method = nestedType.GetMethod("AddtwoNum", BindingFlags.Static | BindingFlags.NonPublic);
        method.Invoke(null, new object[] { default(int), default(int) });
    }
    

答案 1 :(得分:0)

这样,它对我有用:

class SomeClass
{
    private static class SomePrivateClass
    {
        public static int AddtwoNum(int num1, int num2)
        {
            return num1 + num2;
        }
    }
    class SomePublicClass
    {
        private int x = SomePrivateClass.AddtwoNum(1, 2);

        public void InteractWithSomePrivateClass()
        {
            SomePrivateClass.AddtwoNum(1,2); //no problem
        }
    }
}

相同的命名空间,相同的程序集,私有的尊重。

作为stated by Microsoft

  

私人成员只能在班级或团体内访问   声明它们的结构。

因此,在“SomeClass”类的主体内,类“SomePrivateClass”是已知的。

“SomePublicClass”类位于“SomeClass”类的主体内,因此它也知道“SomePrivateClass”。

注意:SomeClass实际上不是成员,但无论如何定义都适用。 Here is a more general statement

  

private:类型或成员只能通过相同的代码访问   类或结构。

答案 2 :(得分:0)

我知道这不是你想要的,但为什么不将SomePrivateClass标记为内部而非私有。然后该类只在程序集中可见。