استخدام Reflection.Emit الخاص بـ .NET لإنشاء واجهة

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

  •  02-07-2019
  •  | 
  •  

سؤال

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

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

المحلول

سؤالك ليس محددًا جدًا.إذا قمت بتحديثها بمزيد من المعلومات، فسوف أقوم بتوضيح هذه الإجابة بتفاصيل إضافية.

فيما يلي نظرة عامة على الخطوات اليدوية المتبعة.

  1. قم بإنشاء تجميع باستخدام DefineDynamicAssembly
  2. قم بإنشاء وحدة نمطية باستخدام DefineDynamicModule
  3. قم بإنشاء النوع باستخدام DefineType.تأكد من المرور TypeAttributes.Interface لجعل النوع الخاص بك واجهة.
  4. قم بالتكرار على الأعضاء في الواجهة الأصلية وقم ببناء أساليب مماثلة في الواجهة الجديدة، مع تطبيق السمات حسب الضرورة.
  5. يتصل TypeBuilder.CreateType للانتهاء من بناء الواجهة الخاصة بك.

نصائح أخرى

لإنشاء تجميع ديناميكيًا بواجهة تحتوي على سمات:

using System.Reflection;
using System.Reflection.Emit;

// Need the output the assembly to a specific directory
string outputdir = "F:\\tmp\\";
string fname = "Hello.World.dll";

// Define the assembly name
AssemblyName bAssemblyName = new AssemblyName();
bAssemblyName.Name = "Hello.World";
bAssemblyName.Version = new system.Version(1,2,3,4);

// Define the new assembly and module
AssemblyBuilder bAssembly = System.AppDomain.CurrentDomain.DefineDynamicAssembly(bAssemblyName, AssemblyBuilderAccess.Save, outputdir);
ModuleBuilder bModule = bAssembly.DefineDynamicModule(fname, true);

TypeBuilder tInterface = bModule.DefineType("IFoo", TypeAttributes.Interface | TypeAttributes.Public);

ConstructorInfo con = typeof(FunAttribute).GetConstructor(new Type[] { typeof(string) });
CustomAttributeBuilder cab = new CustomAttributeBuilder(con, new object[] { "Hello" });
tInterface.SetCustomAttribute(cab);

Type tInt = tInterface.CreateType();

bAssembly.Save(fname);

وهذا يخلق ما يلي:

namespace Hello.World
{
   [Fun("Hello")]
   public interface IFoo
   {}
}

تستخدم طرق الإضافة فئة MethodBuilder عن طريق استدعاء TypeBuilder.DefineMethod.

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