私人方法

本文关键字:方法 | 更新日期: 2023-09-27 18:28:05

在我的项目中,我经常想要一个私有的方法(或函数,如果你愿意的话(,但是我也想从另一个类访问它。有这种可能吗?

澄清一下,可以从 ClassA 访问此方法,它自己的类,但不能访问任何其他类。

私人方法

有很多

方法可以做到这一点,直到你的最后一个语句是"并且只有那个类",我只能想到一种方法来做到这一点,那就是将类布置在程序集中,如下所示:

程序集 A 仅包含类 A,其中的方法要声明为内部

声明为友好程序集的程序集 B:https://msdn.microsoft.com/en-us/library/0tke9fxk.aspx 并包含调用 A 的代码(它可以是内部的,就好像在同一个程序集中一样,因为它是友元程序集(

链接到 A、B 或两者的其他程序集都无法在类 A 上调用该方法,因为它是内部的。

我能想到的最好的方法是这个。

在 C# 5 中,添加了一组调用方信息属性,即 [System.Runtime.CompilerServices.CallerMemberName][System.Runtime.CompilerServices.CallerFilePath][System.Runtime.CompilerServices.CallerLineNumber] 。我们可以使用该CallerFilePathAttribute来查看调用方是否来自特定的.cs文件。

通常,一个文件只包含一个类或结构。例如,ClassAClassA.cs 中定义。可以检查调用方文件名是否与方法中的ClassA.cs匹配。

因此,请像这样修改方法的参数:

([CallerFilePath] string callerFilePath = "" /*Other parameters*/)

在方法中,检查callerFilePath是否与 ClassA 的文件路径匹配。如果没有,则抛出一个异常,指出该方法只能从ClassA访问!

如果此方法适合您的 OOP 结构,则可以保护此方法:

public class A 
{
    protected void Test()
    {
        Console.WriteLine("I can only be called from B");
    }
}
public class B : A
{
    public void Pub()
    {
        Test();
    }
}

还有许多其他方法可以做到这一点。

但是,总的来说,这听起来像是对访问修饰符的错误看法。
如果只想从一个位置调用方法,则只需从一个位置调用它。
事实上,这种方法应该从另一个类调用,这使他在逻辑和体系结构上都是公开的。

控制成员访问的另一种简单方法是使用委托。假设您有一个私有方法:

class SecureMethod {
    private void DoSomething() { }
}
可以通过向此方法

注入委托来提供对此方法的访问:

class ClassA {
 public ClassA(Action secureMethod) { }
}
SecureMethod  objWithSecureMethod;
var a = new ClassA( objWithSecureMethod.DoSomething );

我正在向您展示如何做到这一点,但这些都是非常糟糕的做法:

public class A
{
    private void CanOnlyCallMethodInClassB();
    public static void SetHandlerCanOnlyCallMethodInClassB(ClassB b)
    {
        b.MethodFromClassA = CanOnlyCallMethodInClassB;
    }
}
public class B
{
    public Action MethodFromClassA { get; set; }
}

在代码中:

var b = new B();
A.SetHandlerCanOnlyCallMethodInClassB(b);
b.MethodFromClassA();

更好的方法是在方法的 A 类中使用 ClassB 的对象。在谷歌上搜索策略模式或使用继承

无论你问什么,在 C# 中都是不可能的。我的意思是你不能只允许一个类使用私有方法。您所能做的就是使用 internal 它只允许一个程序集的类访问您的方法或protected可以在其类和派生类实例中访问

除此之外,您所要求的内容没有任何经验法则,但您可以进行一些黑客攻击,如下所示:

MethodInfo privateMethod = instance.GetType().GetMethod("NameOfPrivateMethod", BindingFlags.NonPublic | BindingFlags.Instance);
privateMethod.Invoke(instance, new object[] { methodParameters });
在 A 类

中使用类 B 的方法的一个稍微肮脏的技巧是使该方法受到保护而不是私有,并从 B 派生 A。

另一种可能更好的可能性是使该方法成为内部方法而不是私有方法,然后将类 A 和 B 放在同一个程序集中。