如何禁止调用方法C#

Ale*_*r G 14 .net c# permissions .net-security

我想允许仅从特定方法调用方法.看看下面的代码.

  private static void TargetMethod()
  {
  }

  private static void ForbiddenMethod()
  {
     TargetMethod();
  }

  private static void AllowedMethod()
  {
     TargetMethod();
  }
Run Code Online (Sandbox Code Playgroud)

我只需要AllowedMethod可以调用TargetMethod.如何使用来自的类System.Security.Permissions

更新:感谢您的回答,但我不想讨论我的应用程序的设计.我只是想知道是否可以使用.net安全性来做到这一点?

Mar*_*ann 24

您可以使用常规的面向对象设计来解决此问题.移动AllowedMethod到新类并创建该类ForbiddenMethod的私有方法:

public class MyClass
{
    public void AllowedMethod() { // ... }

    private void TargetMethod() { // ... }
}
Run Code Online (Sandbox Code Playgroud)

AllowedMethod可以访问私有成员,但没有其他人拥有.


Jør*_*ode 8

我相信你应该尝试结构meaningfull类代码,并使用标准的访问修饰符(private,protected,public,internal).有什么特别的理由说明为什么这不能解决你的问题?

我能想到的唯一替代方法是从被调用者内部遍历调用堆栈,但这可能会导致代码混乱和次优性能.


Tho*_*rin 6

您可以检查调用堆栈来完成此任务,但速度相当慢.如果可以避免,我不会推荐它.

如果您仍然希望这样做,您还需要小心避免方法内联,否则您的代码可能会突然停止在Release版本下工作.

[MethodImpl(MethodImplOptions.NoInlining)]
private static void TargetMethod()
{
    StackFrame fr = new StackFrame(1, false);
    Console.WriteLine(fr.GetMethod().Name);
}
Run Code Online (Sandbox Code Playgroud)

据我所知,没有开箱即用的属性来做到这一点.


Eam*_*nne 4

如果代码在完全信任的情况下运行,CAS 无法执行此操作。

如果代码在完全信任(即正常的本地应用程序,而不是 silverlight 应用程序或从网络运行的应用程序)中执行,则所有 .NET CAS 检查都将被完全绕过;任何安全属性都会被忽略。

不过,CAS 只是简单地遍历堆栈来确定权限,您也可以这样做,正如 Darin 之前指出的那样,只需检查StackTrace.