Question

Je veux permettre d'appeler la méthode que des méthodes particulières. Jetez un oeil sur le code ci-dessous.

  private static void TargetMethod()
  {
  }

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

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

J'ai besoin que AllowedMethod pourrait appeler TargetMethod. Comment faire en utilisant des classes de System.Security.Permissions?

Mise à jour: Merci pour vos réponses, mais je ne veux pas débattre sur la conception de ma demande. Je veux juste savoir est-il possible de le faire en utilisant la sécurité .net ou non?

Était-ce utile?

La solution

CAS ne peut pas le faire si le code est en cours d'exécution en pleine confiance.

Si le code est exécuté en toute confiance (à savoir une application normale, locale, pas une application silverlight ou quelque chose exécuter à partir du réseau), tous les contrôles .NET CAS sont complètement contournée; tout attribut de sécurité est tout simplement ignoré.

CAS marche simplement la pile pour déterminer les autorisations, cependant, et vous pouvez le faire aussi, comme Darin a souligné plus tôt par vérifier simplement la StackTrace.

Autres conseils

Vous pouvez résoudre ce en utilisant la conception orientée objet normal. Déplacer AllowedMethod à une nouvelle classe et de faire ForbiddenMethod une méthode privée de cette classe:

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

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

AllowedMethod a accès aux membres privés, mais personne d'autre ont.

Je crois que vous devriez essayer de structurer votre code dans les classes meaningfull, et utiliser les modificateurs d'accès standard (private, protected, public, internal). Y at-il raison précise pour laquelle cela ne résoudrait pas votre problème?

La seule alternative que je peux penser, impliquerait traverser la pile d'appel à partir du callee, mais cela produirait probablement gâchis de code et de la performance sous-optimale.

Vous pouvez examiner la pile d'appel pour ce faire, mais il est plutôt lent. Je ne le recommanderais pas si elle peut être évitée.

Si vous voulez toujours ce faire, vous devez être prudent pour éviter la méthode inline ainsi, ou votre code pourrait fonctionner soudainement sous construit Release.

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

Pour autant que je sache, il n'y a pas hors-the-box des attributs pour le faire.

Je ne sais pas si cela est réalisable avec System.Security.Permissions, mais à l'intérieur TargetMethod vous pourriez obtenir l'appelant et agir en conséquence:

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

Vous pourriez être en mesure d'utiliser des objets CodeAccessPermission. Il faudrait implémenter l'interface dans votre propre objet de le faire fonctionner comme vous suggérez bien.

http://msdn.microsoft.com/en -nous / bibliothèque / system.security.codeaccesspermission.aspx

En utilisant les attributs que vous pouvez résoudre ce problème.

Utilisation conditionnelle Attributs.

Dans le top

#define "Show" 


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

L'un de vos methos seront appelés.

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top