क्या सी # में रनटाइम पर एक प्रकार का निर्माण करना संभव है जो सामान्य वर्ग से विरासत में मिलता है जहां बेस क्लास के लिए टेम्पलेट पैरामीटर वर्तमान वर्ग का निर्माण किया जा रहा है? यह ठीक संकलन होगा:रनटाइम पर "MyClass: OtherClass <MyClass> {}" टाइप करें?
// I have this class:
public class OtherClass<T>
where T : OtherClass<T>
{ }
// I want to create this at runtime:
public class MyClass : OtherClass<MyClass>
{ }
लेकिन मुझे यकीन नहीं कर रहा हूँ कैसे System.Reflection.Emit.ModuleBuilder.TypeBuilder
का उपयोग कर MyClass
बनाने के लिए:
AssemblyName asn = new AssemblyName("test.dll");
AssemblyBuilder asb = AppDomain.CurrentDomain.DefineDynamicAssembly(
asn, AssemblyBuilderAccess.RunAndSave, @"D:\test_assemblies");
ModuleBuilder = modb = asb.DefineDynamicModule("test", "test.dll");
TypeBuilder tb = modb.DefineType(
"test",
TypeAttributes.Public | TypeAttributes.Class,
typeof(MyClass)); // How to specify inheritance?
// populate properties, fields, methods, etc., emit...
tb.CreateType();
यह संभव है?
संपादित करें - उत्तर के आधार पर अब तक, मैं इस कोशिश की है:
public class OtherClass<T>
where T : OtherClass<T>
{ }
public static void CreateSimple()
{
AssemblyName asn = new AssemblyName("test");
AssemblyBuilder asb = AppDomain.CurrentDomain.DefineDynamicAssembly(
asn, AssemblyBuilderAccess.RunAndSave, @"D:\test_asms");
ModuleBuilder modb = asb.DefineDynamicModule("test", "test.dll");
try
{
TypeBuilder tb = modb.DefineType(
"MyClass",
TypeAttributes.Public | TypeAttributes.Class);
Type my = tb.CreateType();
tb.SetParent(typeof(OtherClass<>).MakeGenericType(my));
my = tb.CreateType();
}
catch (Exception e)
{
throw;
}
}
लेकिन यह अपवाद:
GenericArguments[0], 'MyClass', on 'MyProject.Factory+OtherClass`1[T]'
violates the constraint of type 'T'.
लेकिन ... क्यों आप इस करना होगा? – LightStriker
@LightStriker: क्योंकि 99% 'MyClass' प्रकार कोड में परिभाषित किए गए हैं, लेकिन तैनाती (एनएचबीरनेट मॉडल) और 'अन्य क्लास' के बाद कुछ बनाने की आवश्यकता है, यह प्रतिबंधित करता है कि जेनेरिक प्रकार 'अन्य क्लास' से प्राप्त होता है। – wes
मैंने अपना जवाब संपादित किया - यह जेनेरिकअर्गमेंट अपवाद के बिना अब काम करेगा। – gracchus