在c#中,我希望将抽象类应用于许多其他类。如何在不标记每个班级的情况下完成。
public abstract class Bar
{
public bool Blah { get; set; }
}
public class Foo : Bar
{
public int FooId { get; set; }
}
public class Stool : Bar {}
public class Fun : Bar {}
public class NoFun : Bar {}
等等。
有没有办法只抓住每个类,然后将其标记为继承Bar
?
答案 0 :(得分:4)
没有。你可以有一个可视化工作室加载项,或者其他类似的静态代码操作工具,但就语言本身而言,没有办法在运行时修改类型的继承,就我而言知道没有现成的视觉工作室功能为你做这件事。
答案 1 :(得分:1)
除了使用模板和/或VS加载项作为提到的其他海报之外,技术上可以使用Reflection.Emit来做到这一点,尽管它非常费力并且可能不是非常高效。它可能归结为IL操作并且必须创建一个函数,该函数将IL从基类手动映射到新的动态类型。
如果您可以使用接口而不是抽象类,那可能会更容易一些。以下是一些示例代码,可以帮助您开始:
AssemblyName assemblyName = new AssemblyName("MyDynamicAssembly");
AssemblyBuilder assemblyBuilder = AppDomain.CurrentDomain.DefineDynamicAssembly
(assemblyName, AssemblyBuilderAccess.RunAndSave);
ModuleBuilder moduleBuilder = assemblyBuilder.DefineDynamicModule
("MyDynamicAssembly", "MyDynamicAssembly.dll");
TypeBuilder typeBuilder = moduleBuilder.DefineType
("MyDynamicAssembly." + typeName, TypeAttributes.Public, typeof(object));
typeBuilder.AddInterfaceImplementation(typeof(IMyInterface));
typeBuilder.DefineDefaultConstructor(MethodAttributes.Public);