الواصلة في اسم الطريقة ، هل هو ممكن في أي لغة .NET؟

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

  •  20-09-2019
  •  | 
  •  

سؤال

أحتاج إلى دعم طريقة تدعى "Send-request" كدالة تمديد لاستخدامها في تحويل XSLT. يتم توفير هذا بواسطة كائن تمديد على XslCompiledTransform. الشيء الرائع حول كائنات التمديد مقابل. <msxsl:script> هو ، حسنا ، أنني لست مضطرا لاستخدام <msxsl:script>, ، أنت فقط تعلن مساحة الاسم واتصل بالوظيفة. الشيء السيئ هو أن اسم الوظيفة يجب أن يتطابق تمامًا مع اسم طريقة CIL.

لذا ، أنا أتساءل ، هل هناك لغة .NET تدعم الواصلة في أسماء الأسلوب؟ لا يلزم الامتثال CLS ، يتم استدعاء الطريقة باستخدام الانعكاس.

أو هل يمكنني استخدام بعض التقنيات التي تعدل IL من التجميع لتغيير اسم الطريقة؟

أو ، هل هناك طريقة لاعتراض الانعكاس GetMethod اتصل وخداع المتصل الذي توجد به طريقة إرسال "إرسال" ، ولكن إرجاع طريقة "sendRequest" بدلاً من ذلك؟

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

المحلول

يمكنك القيام بذلك باستخدام التفكير.

قمت بتجميع ما يلي في مجموعة باستخدام ILASM (لقد قطعت كل الزغب اللازم لجعل هذا الأمر فعليًا ؛ هذه مجرد أجزاء بارزة (المقصود التورية)):

.method private hidebysig static int32 
'Te-st'() cil managed {
    // Code size       8 (0x8)
    .maxstack  1
    .locals init ([0] int32 CS$1$0000)
    IL_0000:  nop
    IL_0001:  ldc.i4.s 0x11
    IL_0002:  stloc.0
    IL_0003:  br.s       IL_0005

    IL_0005:  ldloc.0
    IL_0006:  ret
}

لقد حددت هذه الطريقة في فصل اسمه Program في مساحة اسم Test. لاحظ أن اسم الطريقة محاط باقتباسات واحدة. هذا في المواصفات (ECMA #335):

يتم استخدام المعرفات لتسمية الكيانات. المعرفات البسيطة تعادل معرف. ومع ذلك ، فإن بناء جملة ILASM يسمح باستخدام أي معرف يمكن تشكيله باستخدام مجموعة أحرف Unicode (انظر القسم I). لتحقيق ذلك ، يتم وضع معرف ضمن علامات اقتباس واحدة.

ثم:

var assembly = Assembly.LoadFrom(path);
var method = assembly.GetType("Test.Program")
                     .GetMethod(
                         "Te-st",
                         BindingFlags.Static | BindingFlags.NonPublic
             );
Console.WriteLine(method.Invoke(null, null));

هذا الناتج المنتجة:

17

أشك في أن هذا هو الممكن في اللغات المعتادة .NET. لا أعرف أي لغات تسمح/تتطلب منك "الهروب" معرفات. بدون ذلك ، هل يمكن أن تتخيل محاولة إزالة الغموض فيما يلي:

int a;
int b;
int a-b;
int diff = a-b; // is that a minus b or the variable a-b?

ربما هناك cobol.net حيث يمكنك القيام بذلك ، لا أعرف.

نصائح أخرى

الواصلات في أسماء المعرفات شائعة جدًا في LISP والمخطط ، وبالتالي أظن أنها مدعومة أصليًا في Ironscheme, ، على الأقل. من السهل أيضًا إنشاء طرق مثل هذه في Ruby ، بالرغم من حقيقة أن hypens غير قانونية بالفعل في معرفات الياقوت ، بحيث يمكنك استخدامها Ironruby.

أيضا ، هناك @ Escape-thingy في C# يتيح لك استخدام معرفات غير قانونية خلاف ذلك ، لكنني لم أستطع معرفة كيفية استخدامها لهذه الحالة.

أعتقد أن أبسط شيء يمكنك القيام به هنا هو تحديد الطريقة مباشرة في IL. حدد أولاً فئة مجردة تحتوي على كل طريقة أخرى تريدها. ثم حدد فئة مشتقة في IL التي تحتوي على اسم طريقة الواصلة وتجميعها في مكتبة منفصلة.

أنا متأكد بشكل معقول من أن جزءًا من المواصفات الخاصة بلغات CLR هو أنه يجب أن يكونوا قادرين على التعامل مع أي اسم يدعمه وقت التشغيل ، حتى لو كان كلمة رئيسية محجوزة في تلك اللغة أو غير قانوني.

على افتراض أن هذا هو الحال ، إذا كان وقت التشغيل يدعم الواصلة في أسماء الأسلوب ، فيجب أن تكون جميع لغات CLR قادرة على التعامل معها ، حتى لو كانت تتطلب شيئًا مثل EG VB.NET's [] بناء جملة لإعلانها أو استخدامها.

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