2008-09-25 12 views
7

मुझे मौजूदा इंटरफ़ेस के रूप में सभी सदस्यों के साथ रन-टाइम पर एक नया इंटरफ़ेस उत्पन्न करने की आवश्यकता है, सिवाय इसके कि मैं कुछ तरीकों से अलग-अलग विशेषताओं को रखूंगा (कुछ गुण पैरामीटर रन-टाइम तक ज्ञात नहीं हैं)। यह कैसे प्राप्त किया जा सकता है?.NET के प्रतिबिंब का उपयोग करना। इंटरफ़ेस उत्पन्न करने के लिए प्रवेश करें

उत्तर

8

आपका प्रश्न बहुत विशिष्ट नहीं है। यदि आप इसे अधिक जानकारी के साथ अपडेट करते हैं, तो मैं अतिरिक्त उत्तर के साथ इस उत्तर को निकाल दूंगा।

यहां शामिल मैन्युअल चरणों का एक अवलोकन है।

  1. DefineDynamicModule
  2. के साथ एक मॉड्यूल बनाएं DefineDynamicAssembly
  3. साथ एक विधानसभा बनाएं DefineType साथ प्रकार बनाएं। अपना टाइप इंटरफेस बनाने के लिए TypeAttributes.Interface पास करना सुनिश्चित करें।
  4. मूल इंटरफ़ेस में सदस्यों पर Iterate और नए इंटरफ़ेस में समान विधियों का निर्माण, आवश्यकतानुसार विशेषताओं को लागू करना।
  5. अपने इंटरफ़ेस को बनाने के लिए TypeBuilder.CreateType पर कॉल करें।
+0

नहीं, यह अच्छा है। मुझे प्रतिबिंब का उपयोग करने की आवश्यकता नहीं है। इससे पहले स्वीकार करें ताकि सिर्फ यह देखना चाहें कि कोई मेरी बुराई मास्टर प्लान में ठोकर खा सकता है या नहीं। –

12

गतिशील एक अंतरफलक गुण होते हैं उस के साथ एक विधानसभा बनाने के लिए:

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 
    {} 
} 

जोड़ना तरीकों TypeBuilder.DefineMethod फोन करके MethodBuilder वर्ग का उपयोग करें।

संबंधित मुद्दे

 संबंधित मुद्दे