我想允许主叫只能从特定方法的方法。看看下面的代码。

  private static void TargetMethod()
  {
  }

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

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

我只需要AllowedMethod可以打电话TargetMethod。如何利用System.Security.Permissions类的关系呢?

更新:谢谢您的回答,但我不想讨论我的应用程序的设计。我只是想知道是否可以使用.NET的安全与否关系呢?

有帮助吗?

解决方案

如果代码是在完全信任运行CAS不能做到这一点。

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

CAS只是走栈确定的权限,不过,你可以通过只检查StackTrace做到这一点,因为达林前面指出的。

其他提示

可以解决这个使用普通的面向对象设计。移动AllowedMethod一类新的,使该ForbiddenMethod类的私有方法:

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

    private void TargetMethod() { // ... }
}

AllowedMethod访问私有成员,但没有其他人具有。

我相信你应该尝试结构meaningfull类代码,并使用标准的访问修饰符(privateprotectedpublicinternal)。有没有为什么这不会解决你的问题的任何具体的原因是什么?

我能想到的唯一的替代方法,将涉及从被调用遍历内调用栈,但是这可能会产生的代码的混乱和次优的性能。

您可以检查调用堆栈来做到这一点,但它是相当缓慢。我不会建议,如果能够避免它。

如果你仍然想做到这一点,你必须要小心,以避免方法内联一样好,甚至你的代码可能会突然停止工作下发布版本。

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

据我所知,有没有外的开箱属性来做到这一点。

我不知道这是否与System.Security.Permissions可以实现的,但里面TargetMethod你可以让来电者并采取相应措施:

StackTrace stackTrace = new StackTrace();
Console.WriteLine(stackTrace.GetFrame(1).GetMethod().Name);

您可能能够使用的CodeAccessPermission对象。你必须实现该接口在自己的对象有它的工作就像你是在暗示,虽然。

http://msdn.microsoft.com/en -us /库/ system.security.codeaccesspermission.aspx

通过使用属性就可以解决这个问题。

使用条件Attributs。

在顶

#define "Show" 


  public void TargetMethod()
    {
      //Code
    }
   [ Conditional("Hidden")]
   public void HiddenMethod()
    {
       TargetMethod()
    }
 [ Conditional("Show")]
  public void AllowMethod()
    {
       TargetMethod()
    }

你的一个methos将被调用。

许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top