سؤال

أريد أن أسمح باستدعاء الطريقة فقط من الأساليب المعينة. ألقِ نظرة على الكود أدناه.

  private static void TargetMethod()
  {
  }

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

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

أحتاج فقط المسموح به يمكن أن يستدعي TargetMethod. كيفية القيام بذلك باستخدام فصول من System.Security.Permissions?

محدث: شكرًا على إجاباتك ، لكنني لا أريد مناقشة تصميم طلبي. أريد فقط أن أعرف هل من الممكن القيام بذلك باستخدام .NET Security أم لا؟

هل كانت مفيدة؟

المحلول

لا يمكن لـ CAS القيام بذلك إذا كان الرمز يعمل بثقة كاملة.

إذا كان الرمز ينفذ بثقة كاملة (أي تطبيق محلي طبيعي ، وليس تطبيق Silverlight أو شيء يتم تشغيله من الشبكة) ، فسيتم تجاوز جميع عمليات فحص .NET CAS تمامًا ؛ يتم تجاهل أي سمة أمان ببساطة.

CAS يمشي ببساطة المكدس لتحديد الأذونات ، على الرغم من ذلك ، ويمكنك القيام بذلك أيضًا ، كما أشار دارين في وقت سابق عن طريق التحقق من مجرد التحقق من StackTrace.

نصائح أخرى

يمكنك حل هذا باستخدام التصميم العادي الموجهة للكائن. نقل AllowedMethod إلى فصل جديد وجعل ForbiddenMethod طريقة خاصة لتلك الفئة:

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

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

المسموح به يمكنه الوصول إلى أعضاء من القطاع الخاص ، ولكن لا يوجد أي شخص آخر.

أعتقد أنك يجب أن تحاول هيكلة الكود الخاص بك في فئات ذات معنى ، واستخدام معدلات الوصول القياسية (private, protected, public, internal). هل هناك أي سبب محدد لعدم حل مشكلتك؟

البديل الوحيد الذي يمكنني التفكير فيه ، سيشمل اجتياز مكدس المكالمات من داخل Callee ، ولكن من المحتمل أن ينتج عن ذلك فوضى الكود والأداء دون المستوى الأمثل.

يمكنك فحص مكدس المكالمات لإنجاز هذا ، لكنه بطيء إلى حد ما. لا أوصي به إذا كان يمكن تجنبه.

إذا كنت لا تزال ترغب في القيام بذلك ، فيجب أن تكون حريصًا على تجنب إطار العمل أيضًا ، أو قد يتوقف الكود فجأة عن العمل قيد الإصدار.

[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/library/system.security.codeaccesspermission.aspx

باستخدام السمات ، يمكنك حل هذه المشكلة.

استخدام النسب الشرطية.

في قمة

#define "Show" 


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

سيتم استدعاء أحد الميثوس الخاص بك.

مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top