2015-07-11 7 views
5

मेरे पास दो साधारण वर्ग हैं।प्रतिबिंब कैसे कर सकते हैं। असंगत प्रकार असाइन करें?

public class A { } 
public class B { } 

मैं नीचे C कक्षा का निर्माण और तत्कालता करता हूं।

var assemblyBuilder = AppDomain.CurrentDomain.DefineDynamicAssembly(new AssemblyName("Some.Namespace"), AssemblyBuilderAccess.Run); 
var moduleBuilder = assemblyBuilder.DefineDynamicModule(assemblyBuilder.GetName().Name); 

// public class C 
var typeBuilder = moduleBuilder.DefineType("C", TypeAttributes.Public | TypeAttributes.Class, typeof(object)); 

// public A A; 
var aField = typeBuilder.DefineField("A", typeof(A), FieldAttributes.Public); 

// public C() { this.A = new B(); } !!!! 
var ctorBuilder = typeBuilder.DefineConstructor(MethodAttributes.Public, CallingConventions.HasThis, Type.EmptyTypes); 
var ctorIL = ctorBuilder.GetILGenerator(); 
ctorIL.Emit(OpCodes.Ldarg_0); 
ctorIL.Emit(OpCodes.Newobj, typeof(B).GetConstructor(Type.EmptyTypes)); 
ctorIL.Emit(OpCodes.Stfld, aField); 
ctorIL.Emit(OpCodes.Ret); 

// return new C(); 
var type = typeBuilder.CreateType(); 
return Activator.CreateInstance(type); 

समस्या यह है कि मैं सफलतापूर्वक कक्षा C को तुरंत चालू कर सकता हूं। जब मैं C.A के प्रकार और मान की जांच करता हूं तो यह मेरे लिए बहुत ही आश्चर्यजनक था।

var c = CreateC(); 

var field = c.GetType().GetField("A"); 
var fieldValue = c.GetType().GetField("A").GetValue(c); 

Console.WriteLine(typeof(A) == field.FieldType);  // True 
Console.WriteLine(typeof(A) == fieldValue.GetType()); // False 
Console.WriteLine(typeof(B) == field.FieldType);  // False 
Console.WriteLine(typeof(B) == fieldValue.GetType()); // True 

संक्षेप में, मेरे पास निम्नलिखित कक्षाएं हैं जो काम कर रही हैं!

public class A { } 
public class B { } 

public class C 
{ 
    public A A; 
    public C() 
    { 
     this.A = new B(); 
    } 
} 

मेरे प्रश्न हैं:

  1. यह कैसे संभव हो सकता है?
  2. सीएलआर किस स्तर पर जांच करता है?
+0

असल में सबकुछ काम कर रहा है जैसा कि करना चाहिए। एक फ़ील्ड प्रकार, घोषित प्रकार और फ़ील्ड मान प्रकार आपके परीक्षण को दिखाया गया है। – leppie

+0

फिर, कन्स्ट्रक्टर किसी भी अपवाद के साथ निष्पादन कैसे करता है? –

+0

मुझे समझ में नहीं आता कि आप अपवाद की अपेक्षा क्यों करते हैं। क्या आपको सामान्य कोड में अपवाद मिलता है? और क्या अपवाद है? – leppie

उत्तर

3

यदि आपका कोड पूर्ण विश्वास के तहत चलता है, तो सीएलआर यह जांचने से परेशान नहीं है कि आईएल "सत्यापित करने योग्य" है। इसका मतलब है कि कोड पागल चीजों के सभी प्रकार कर सकता है, और यह सुनिश्चित करने के लिए कि आपके द्वारा उत्सर्जित कोड सुरक्षित है, यह आपकी ज़िम्मेदारी है।

हालांकि, अपने कोड आंशिक विश्वास के अधीन ही है, तो Activator.CreateInstance(type) फेंक होगा System.Security.VerificationException ("ऑपरेशन क्रम को अस्थिर कर सकता है")।

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