.NETで動的型を作成すると、デフォルトのコンストラクタが生成されます。どのように私はそれを抑制するのですか?生成された動的型のデフォルトコンストラクタを抑制する方法
var typeBuilder = moduleBuilder.DefineType(
type.FullName,
TypeAttributes.NotPublic | TypeAttributes.BeforeFieldInit);
.NETで動的型を作成すると、デフォルトのコンストラクタが生成されます。どのように私はそれを抑制するのですか?生成された動的型のデフォルトコンストラクタを抑制する方法
var typeBuilder = moduleBuilder.DefineType(
type.FullName,
TypeAttributes.NotPublic | TypeAttributes.BeforeFieldInit);
これは、TypeBuilder.DefineConstructor Methodの「備考欄」に記載されています。
あなたは、ダイナミック型のコンストラクタを定義しない場合、デフォルト コンストラクタが自動的に提供され、それがベースクラスのデフォルト コンストラクタを呼び出しています。
ダイナミックタイプにコンストラクタを定義すると、デフォルトの コンストラクタは提供されません。あなたは、
あなたは、単にベースクラスのデフォルト コンストラクタを呼び出し、既定のコンストラクタをしたい場合:あなたは が定義されたコンストラクタに加えて、デフォルトコンストラクタを提供 には、以下のオプションを持っています DefineDefaultConstructorメソッドを使用して1つを作成できます(オプションで、 へのアクセスを制限することもできます)。このデフォルトの コンストラクタの実装を提供しないでください。そうすると、 コンストラクタを使用しようとすると例外がスローされます。 CreateTypeメソッドが である場合、例外はスローされません。
あなたは単に は、基底クラスのデフォルトコンストラクタを呼び出すこと以上の何かをするデフォルトコンストラクタをしたい、または、その基本クラスの 別のコンストラクタを呼び出し、またはそれは完全に何か他のもの をした場合TypeBuilder.DefineConstructorメソッドを使用して を作成し、独自の実装を提供する必要があります。
この動作は、明示的にデフォルトコンストラクタを定義せずにクラスを定義した場合よりも違いはありません。コンパイラは基本コンストラクタを呼び出すパブリックデフォルトコンストラクタを生成します。
あなたがプライベート既定のコンストラクタをしたい場合は、:
ConstructorBuilder ctor = typeBuilder.DefineDefaultConstructor(MethodAttributes.Private);
編集:コメントで
、それはstatic
クラスがコンストラクタを持っていないと述べました。リフレクターで前後に少しずつ行った後、次のコードではc#で生成されたデフォルトの属性と同じ静的な動的クラスが作成されることがわかりました。
public void Test()
{
AssemblyName asmName = new AssemblyName("TestAsmStatic");
AssemblyBuilder ab = AppDomain.CurrentDomain.DefineDynamicAssembly(asmName, AssemblyBuilderAccess.RunAndSave);
ModuleBuilder mb = ab.DefineDynamicModule(asmName.Name, asmName.Name + ".dll");
TypeBuilder tb = mb.DefineType("StaticType", TypeAttributes.NotPublic | TypeAttributes.Sealed | TypeAttributes.BeforeFieldInit | TypeAttributes.Abstract);
Type t = tb.CreateType();
ab.Save(asmName.Name + ".dll");
ConstructorInfo[] ci = t.GetConstructors((System.Reflection.BindingFlags)(BindingFlags.NonPublic | BindingFlags.Public | BindingFlags.Instance | BindingFlags.Static));
Console.WriteLine(ci.Length.ToString());
}
ありがとうございました。私はこの文書を知っていた。しかし、私はコンストラクタ*をまったく必要としません。 C#では 'static class'(これはどちらか、あるいはCLRがなんらかの理由でそれを必要とする場合はプライベートデフォルトのctorを生成するかもしれません)でこれを行うことができます。 私はあなたが既定のctorをプライベートにするために言及したドキュメントに従うことができると思います。私はまったく定義しないことを望んでいました。 –
@AndrewArnott、静的なクラスについての良い点。私は決してそれを発行しようとしなかったし、それが可能かどうかもわかっていない。私はそれを見てみましょう。 – TnTinMn
私はC#の '静的class'さんがプライベート既定のコンストラクタが含まれていないことをILDASMを経由して確認しました。 CLRは明らかにそれを強制しません。唯一の疑問は.NETが 'TypeBuilder'を使って方法を提供するかどうかです。 –