لماذا لديك لاستخدام "هذا" للدعوة لطريقة تمديد من داخل الطبقة طويلة؟

StackOverflow https://stackoverflow.com/questions/1616294

  •  06-07-2019
  •  | 
  •  

سؤال

ولقد العشرات من أساليب الإرشاد وأنهم جميعا العمل المكتوب كما هو متوقع. ولكن هذه هي المرة الأولى التي واجهت باستخدام طريقة تمديد في هذا السياق.

public static class ControllerExtensions
{
    public static RedirectToRouteResult RedirectToAction<TController>(
        this Controller controller
        , Expression<Action<TController>> action
      ) where TController : Controller
    {
      RouteValueDictionary routeValuesFromExpression = 
        ExpressionHelper.GetRouteValuesFromExpression<TController>(action);

      return new RedirectToRouteResult(routeValuesFromExpression);
    }
}

ويبدو العادي بما فيه الكفاية، أليس كذلك؟ ولكن ضمن وحدات تحكم بلدي، وأنا لا يمكن الوصول إلى هذا الأسلوب تمديد عن طريق كتابة. بدلا من ذلك، لا بد لي من بادئة مع الكلمة "هذا". على سبيل المثال:

// This does not work, I get a compiler error because
// RedirectToAction has no overload for the generic.
//
return
  RedirectToAction<MembershipController>(
     c => c.RegisterSuccess(Server.UrlEncode(code) ));

// But, this does work?!?!
//
return
  this.RedirectToAction<MembershipController>(
     c => c.RegisterSuccess(Server.UrlEncode(code) ));

والغريب جدا. ربما يكون ذلك بسبب وأنا داخل الكائن سبيل المثال أنا تمديد؟ و"تحكم" المثيل الذي هو؟

والمؤكد، وكنت قادرا على تكرار ذلك في التطبيق وحدة تحكم بسيطة:

class Program
{
    static void Main(string[] args)
    {
        var x = new TestClass();
        x.Go<String>();
    }
}

public class TestClass
{
    public void Go()
    {
    }

    public void NextMethod()
    {
        // compiler error.  :(
        Go<String>();

        // works!
        this.Go<String>();
    }
}

public static class TestExtension
{
    public static string Go<T>(this TestClass theClass)
    {
        return String.Empty;
    }
}

وفعلام "هذا". تعمل؟

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

المحلول

وأساليب الإرشاد ليست جزءا من بحث "الافتراضي" للأعضاء - عليك أن تكون باستخدام تعبير عن شكل Target.Method قبل أن يتم فحص طرق الإرشاد. this.Foo() يتوافق مع هذا الشرط، لذلك يعمل.

ومن قسم 7.5.5.2:

<اقتباس فقرة>   

في توسل طريقة (§7.5.5.1) من   واحدة من أشكال

expr . identifier ( )
expr . identifier ( args )
expr . identifier < typeargs > ( )
expr . identifier < typeargs > ( args ) if the normal processing of the
     

والاحتجاج لا يجد ينطبق   طرق، يتم إجراء محاولة لمعالجة   وبناء كطريقة تمديد   الاحتجاج.

وباعتراف الجميع كل ما يقول هو "مترجم فيما يلي المواصفات" بدلا من السبب في كتابة المواصفات بهذه الطريقة ... أنا لا أعرف ما إذا كان هناك <م> هو أي سبب محدد، على الرغم من حقيقة أنه يمكنك استدعاء كل من أعضاء مثيل و أعضاء ثابتة فقط باستخدام Method() (بدلا من تحديد أي مثيل أو نوع) قد تكون ذات صلة.

نصائح أخرى

وأعتقد أنه بسبب كيفية عمل طرق الإرشاد.

وعندما تكتب العودة ()، يفترض المترجم أن العودة هي طريقة في الفصل الحالي، والتي ليست كذلك.

وأساليب الإرشاد و"تعلق" إلى مثيل، وتحديد سبيل المثال باستخدام هذه الكلمة الرئيسية.

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