3

在 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

4

2 回答 2

4

不,您可以使用 Visual Studio 插件或其他类似的静态代码操作工具,但就语言本身而言,无法在运行时修改类型的继承,而且到目前为止据我所知,没有现有的 Visual Studio 功能可以为您执行此操作。

于 2012-04-11T00:23:35.210 回答
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);
于 2012-04-11T00:44:07.930 回答