5

特定のアセンブリ内のすべてのクラスのデフォルトコンストラクターを定義する方法はありますか?たとえば、アセンブリにこのようなクラスがあります-

public class SomeClass
{
    public SomeClass(int x, int y)
    {
    }
}

これらのクラスはすべてデフォルトのコンストラクターを必要としますが、これらのクラスすべてをデフォルトのコンストラクターでなぞなぞする必要はないので、リフレクションなどを使用してこれを行うにはどうすればよいですか?(おそらくTypeBuilder.DefineDefaultConstructor?)

4

2 に答える 2

3

これらのクラスはすべてデフォルトのコンストラクターを必要としますが、これらのクラスすべてをデフォルトのコンストラクターでなぞなぞする必要はありません。

クラスにコンストラクターが必要な場合は、コンストラクターを含める必要があります。それ以外のものは、メンテナンスの面で悪夢になります。

コンストラクターの自動生成に関する主な問題は、デフォルトのコンストラクターがクラスの値を適切に初期化する必要があるため、問題のクラスについて知る必要があることです。あなたの例では、デフォルトのコンストラクターは、通常とで作成される内部状態を設定するために何かxをする必要がありyます。クラスの知識がなければ、何かがどうあるべきかを知る方法はないので、クラスはそれが定義されるべき場所です。

そうは言っても、「すべての型にコンストラクターを追加する」という直接的な方法はありません。場合によっては、 Cecilなどのツールを使用して、変更を加えてアセンブリを書き換えることができます。基本的には、アセンブリをロードし、各タイプを検査し、新しい情報を追加して、書き換えます。または、 PostSharpなどの何らかの形式のAOPツールを使用して、コンパイル時にいくつかの属性などに基づいてコンストラクターを作成することもできます。

ただし、これらのアプローチには反対することをお勧めします。コード自体を変更し、必要に応じてコンストラクターを含めることが正しいアプローチだと思います。

于 2012-09-28T00:42:52.977 に答える
0

実行時にコンパイル済みクラスを変更して、デフォルトのコンストラクターを追加することはできません。

アスペクト指向プログラミングを使用すると、コンパイル時にそれを行うことができます。PostSharpをチェックしてください。

于 2012-09-28T00:43:08.277 に答える