如何将继承应用于一组类一次

时间:2012-04-11 00:19:34

标签: c# inheritance abstract-class

在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

2 个答案:

答案 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);