मेरे पास दो साधारण वर्ग हैं।प्रतिबिंब कैसे कर सकते हैं। असंगत प्रकार असाइन करें?
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();
}
}
मेरे प्रश्न हैं:
- यह कैसे संभव हो सकता है?
- सीएलआर किस स्तर पर जांच करता है?
असल में सबकुछ काम कर रहा है जैसा कि करना चाहिए। एक फ़ील्ड प्रकार, घोषित प्रकार और फ़ील्ड मान प्रकार आपके परीक्षण को दिखाया गया है। – leppie
फिर, कन्स्ट्रक्टर किसी भी अपवाद के साथ निष्पादन कैसे करता है? –
मुझे समझ में नहीं आता कि आप अपवाद की अपेक्षा क्यों करते हैं। क्या आपको सामान्य कोड में अपवाद मिलता है? और क्या अपवाद है? – leppie