私有方法?

时间:2015-12-25 09:09:38

标签: c# methods private

在我的项目中,我经常想要一个私有的方法(或者你喜欢的函数),但是我也希望从其他类中访问它。这有可能吗?

为了澄清,这个方法可以从ClassA,它自己的类而不是任何其他类访问。​​

7 个答案:

答案 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类放在同一个程序集中。