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

いいえ。これを行うVisualStudioアドイン、または他の同様の種類の静的コード操作ツールを使用することもできますが、言語自体に関しては、実行時に型の継承を変更する方法はありません。私はあなたのためにこれを行うための既存のビジュアルスタジオ機能を知らないので。

于 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 に答える