私人方法
本文关键字:方法 | 更新日期: 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
文件。
通常,一个文件只包含一个类或结构。例如,ClassA
在 ClassA.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 });
中使用类 B 的方法的一个稍微肮脏的技巧是使该方法受到保护而不是私有,并从 B 派生 A。
另一种可能更好的可能性是使该方法成为内部方法而不是私有方法,然后将类 A 和 B 放在同一个程序集中。