Vra

Ek wil toelaat roep die metode net uit die spesifieke metodes. Neem 'n blik op die kode hieronder.

  private static void TargetMethod()
  {
  }

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

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

Ek moet net AllowedMethod kon TargetMethod noem. Hoe om dit te doen met behulp van klasse van System.Security.Permissions?

Opdateer: Dankie vir jou antwoorde, maar ek wil nie te debatteer oor die ontwerp van my aansoek. Ek wil net weet is dit moontlik om dit te doen deur gebruik te maak net sekuriteit of nie?

Was dit nuttig?

Oplossing

CAS kan dit nie doen as die kode loop in volle vertroue.

As die kode is die uitvoering in volle vertroue (dit wil sê 'n normale, plaaslike aansoek, nie 'n Silver aansoek of iets loop van die netwerk), dan sal al NET CAS tjeks word heeltemal geïgnoreer; enige sekuriteit kenmerk is eenvoudig geïgnoreer.

CAS loop net die stapel om toestemming te bepaal, al is, en jy kan dit ook doen, as Darin daarop gewys vroeër deur net die nagaan van die StackTrace.

Ander wenke

Jy kan dit met behulp van normale objekgeoriënteerde ontwerp op te los. Beweeg AllowedMethod om 'n nuwe klas en maak ForbiddenMethod n private metode van daardie klas:

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

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

AllowedMethod het toegang tot private lede, maar niemand anders het.

Ek glo jy moet probeer om jou kode te struktureer in sinvolle klasse, en gebruik die standaard toegang wysigers (private, protected, public, internal). Is daar enige spesifieke rede hoekom dit jou probleem nie sal oplos?

Die enigste alternatief waaraan ek kan dink, sou betrek dwars deur die oproep stapel van binne die callee, maar dit sou waarskynlik oplewer kode gemors en suboptimale prestasie.

Jy kan die oproep stapel om dit te bewerkstellig ondersoek, maar dit is eerder stadig. Ek sou dit nie aanbeveel as dit vermy kan word.

moet jy nog steeds wil om dit te doen, wat jy nodig het om versigtig te wees om metode vermy lining sowel, of jou kode kan skielik ophou werk onder Release bou.

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

Sover ek weet, is daar geen out-of-the-box skryf om dit te doen.

Ek is nie seker of dit haalbaar is met System.Security.Permissions, maar binne TargetMethod jy kan die oproeper kry en daarvolgens op te tree:

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

Jy kan in staat wees om CodeAccessPermission voorwerpe gebruik. Jy wil hê na die koppelvlak implementeer in jou eie voorwerp om dit te werk soos jy al is wat daarop dui.

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

Deur die gebruik van eienskappe wat jy hierdie probleem kan oplos.

Gebruik voorwaardelike Attributs.

In die top

#define "Show" 


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

Een van jou METODES sal genoem word.

Gelisensieer onder: CC-BY-SA met toeskrywing
Nie verbonde aan StackOverflow
scroll top