在我的项目中,我经常想要一个私有的方法(或者你喜欢的函数),但是我也希望从其他类中访问它。这有可能吗?
为了澄清,这个方法可以从ClassA
,它自己的类而不是任何其他类访问。
答案 0 :(得分:2)
如果它适合您的OOP结构,您可以使此方法受到保护:
public class A
{
protected void Test()
{
Console.WriteLine("I can only be called from B");
}
}
public class B : A
{
public void Pub()
{
Test();
}
}
还有很多其他方法可以做到这一点。
但是,一般来说,这听起来像访问修饰符是错误的 如果您只想从一个地方调用您的方法,那么只需从一个地方调用它即可 应该从另一个类调用此方法的事实使他在公共,逻辑和架构上公开。
答案 1 :(得分:2)
我能想到的最佳方式就是这个。
在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
访问该方法!
答案 2 :(得分:2)
有很多方法可以做到这一点,直到你的最后一个语句是"而且只有那个类",我只能想到一种方法来做到这一点,而且是将这些类放在程序集中如此:
程序集A仅包含具有您要声明为内部
的方法的A类程序集B被声明为一个友好的程序集:https://msdn.microsoft.com/en-us/library/0tke9fxk.aspx并包含调用A的代码(它可以是内部的,就像在同一个程序集中一样,就像它是朋友程序集一样)
没有其他与A,B或两者相关联的程序集都可以在A类中调用该方法,因为它是内部的。
答案 3 :(得分:1)
无论您在C#中无法提出什么要求。我的意思是你不能只允许一个类使用私有方法。您所能做的就是使用internal
,它只允许一个程序集的类访问您的方法,或protected
可以在其类和派生类实例中访问它们!
除此之外你没有任何拇指规则,但你可以做一些黑客攻击,如下所示:
MethodInfo privateMethod = instance.GetType().GetMethod("NameOfPrivateMethod", BindingFlags.NonPublic | BindingFlags.Instance);
privateMethod.Invoke(instance, new object[] { methodParameters });
答案 4 :(得分:1)
控制成员访问的另一种简单方法是使用委托。 我们假设您有一个私有方法:
class SecureMethod {
private void DoSomething() { }
}
您可以通过将委托注入此方法来提供对此方法的访问权限:
class ClassA {
public ClassA(Action secureMethod) { }
}
SecureMethod objWithSecureMethod;
var a = new ClassA( objWithSecureMethod.DoSomething );
答案 5 :(得分:1)
我告诉你如何做到这一点,但这些都是非常不好的做法:
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();
但更好方式是在方法的classA中使用ClassB的对象。在谷歌搜索策略模式或使用继承。
答案 6 :(得分:0)
在A类中使用B类方法的一个稍微肮脏的技巧是使方法受保护而不是私有,并从B派生A.
可能更好的另一种可能性是将方法设为内部而非私有,然后将A类和B类放在同一个程序集中。