मैं एक ज्ञात वर्ग से प्राप्त होने वाले रन-टाइम पर एक प्रकार को परिभाषित करने और एक इंटरफ़ेस लागू करने की कोशिश कर रहा था।रन-टाइम पर इंटरफ़ेस कार्यान्वित करना: get_Value विधि लागू नहीं की गई
public class ParentClass
{
}
public interface IImplementMe
{
double Value{get;set}
}
यहां कोड स्निपेट है जो दिखाता है कि मैं अपना लक्ष्य कैसे प्राप्त करने का प्रयास करता हूं।
public class ClassBuilder
{
public Type Build()
{
try
{
AssemblyName assemblyName = new AssemblyName("DataBuilderAssembly");
AssemblyBuilder assemBuilder = Thread.GetDomain().DefineDynamicAssembly(assemblyName, AssemblyBuilderAccess.Run);
ModuleBuilder moduleBuilder = assemBuilder.DefineDynamicModule("DataBuilderModule");
TypeBuilder typeBuilder = moduleBuilder.DefineType("NewClass", TypeAttributes.Class, typeof(ParentClass));
typeBuilder.AddInterfaceImplementation(typeof(IImplementMe));
BuildProperty(typeBuilder, "Value", typeof(double));
Type type = typeBuilder.CreateType();
return type;
}
catch (Exception e)
{
return null;
}
}
private void BuildProperty(TypeBuilder typeBuilder, string name, Type type)
{
FieldBuilder field = typeBuilder.DefineField("m" + name, type, FieldAttributes.Private);
PropertyBuilder propertyBuilder = typeBuilder.DefineProperty(name, PropertyAttributes.None, type, null);
MethodAttributes getSetAttr = MethodAttributes.Public | MethodAttributes.HideBySig;
MethodBuilder getter = typeBuilder.DefineMethod("get_" + name, getSetAttr, type, Type.EmptyTypes);
ILGenerator getIL = getter.GetILGenerator();
getIL.Emit(OpCodes.Ldarg_0);
getIL.Emit(OpCodes.Ldfld, field);
getIL.Emit(OpCodes.Ret);
MethodBuilder setter = typeBuilder.DefineMethod("set_" + name, getSetAttr, null, new Type[] { type });
ILGenerator setIL = setter.GetILGenerator();
setIL.Emit(OpCodes.Ldarg_0);
setIL.Emit(OpCodes.Ldarg_1);
setIL.Emit(OpCodes.Stfld, field);
setIL.Emit(OpCodes.Ret);
propertyBuilder.SetGetMethod(getter);
propertyBuilder.SetSetMethod(setter);
}
}
किसी कारण से मैं एक typeBuilder.CreateType()
बुला पर अपवाद "get_Value विधि लागू नहीं की" मिलता है। अब तक इसके कारण को देखने में असमर्थ।
'MethodAttributes.SpecialName' जोड़ने का प्रयास किया, लेकिन इससे मदद नहीं मिली। :/ –
@ एल.ई.ओ., मैंने आपके कोड को स्वयं करने की कोशिश की, और जब मैंने उल्लेख किया कि सभी विधि विशेषताओं को जोड़ा गया है (वर्चुअल प्रतीत होता है।) –
हाँ, धन्यवाद, एक आकर्षण की तरह काम किया। –