У меня есть следующий абстрактный класс, который НЕ МОЖЕТ быть изменен.Динамическое переопределение абстрактного метода в C#
public abstract class AbstractThing {
public String GetDescription() {
return "This is " + GetName();
}
public abstract String GetName();
}
Теперь я хотел бы реализовать некоторые новые динамические типы из-за этого.
AssemblyName assemblyName = new AssemblyName();
assemblyName.Name = "My.TempAssembly";
AssemblyBuilder assemblyBuilder = Thread.GetDomain().DefineDynamicAssembly(assemblyName, AssemblyBuilderAccess.Run);
ModuleBuilder moduleBuilder = assemblyBuilder.DefineDynamicModule("DynamicThings");
TypeBuilder typeBuilder = moduleBuilder.DefineType(someName + "_Thing",
TypeAttributes.Public |
TypeAttributes.Class,
typeof(AbstractThing));
MethodBuilder methodBuilder = typeBuilder.DefineMethod("GetName",
MethodAttributes.Public |
MethodAttributes.ReuseSlot |
MethodAttributes.Virtual |
MethodAttributes.HideBySig,
null,
Type.EmptyTypes);
ILGenerator msil = methodBuilder.GetILGenerator();
msil.EmitWriteLine(selectionList);
msil.Emit(OpCodes.Ret);
Однако, когда я пытаюсь создать экземпляр через
typeBuilder.CreateType();
я получаю исключение о том, что нет реализации для GetName. Что-то я здесь делаю неправильно. Я не вижу проблемы.
Также были бы ограничения на создание экземпляра такого класса по имени? Например, если я попытался создать экземпляр через «My.TempAssembly.x_Thing», будет ли он доступен для создания экземпляра без генерируемого типа?
Что вы имеете в виду под «инстанцировании такой класс по имени»? Если вы не включаете сгенерированную сборку в свою сборку, вы не можете напрямую ссылаться на ее типы в своей программе. Вам нужно будет использовать Reflection или 'Activator.CreateInstance (Type)'. –
Да, это именно то, что я имею в виду, Type.GetType («My.TempAssembly.x_Thing»), затем на Activator.CreateInstance (type). Он работал нормально. –