2009-07-15 16 views
3

可能性の重複:アセンブリの範囲外から公共のコンストラクタの呼び出しを防止することが可能である場合
Why XML-Serializable class need a parameterless constructor防止シリアライザ

は誰もが知っていますか?

私がやっていることは、XMLのシリアライズ可能なクラスを持つクラスライブラリが出てくることです。これらのクラスは、さまざまなプロパティを設定せずに構築すると意味をなさないので、その状態を防ぐ必要があります。

私のパブリックコンストラクタを呼び出す誰かを防ぐ方法があるのだろうかと疑問に思っています。

+0

この質問のための有効な削除アクセシビリティタグ、ありません。 –

+1

コンストラクターを呼び出すことを防止するために、コンストラクターをパブリックに保つ理由は何ですか? –

+0

コンストラクタは公開されている必要がありますか? –

答えて

1

通常は、オブジェクトを有効にし、有効なデフォルト値を持つパブリックなパラメータのないコンストラクタを作成するパラメータを持つパブリックコンストラクタを作成します。

public foo() { 
    this.bar = -1; 
} 

public foo(int bar) { 
    this.bar = bar; 
} 

内部/プライベートコンストラクタは、状況に応じて使用することができ、あなたが外部コード用のオブジェクトの作成を扱うFactoryパターンを作成することができます。

+0

+1私は通常、あなたは合理的な値を初期化すべきだと同意するからです。しかし、この状況では値は正しいものでなければならない他のクラスです。 – Ian

0

あなたが求めていることを達成するには、おそらくコンストラクタを非公開にしてから、適切なアセンブリがgetInstanceを呼び出す場合はgetInstanceメソッドを使用してオブジェクトを返します。関数をそのパラメータの1つとして呼び出すオブジェクトまたはアセンブリを渡すと、getInstanceメソッドの内部でチェックすることができます。

0

それはあなたのケースで働くだろうかどうかは知りませんが、呼び出し元のアセンブリをチェックすることができ:

if (Assembly.GetCallingAssembly().GetName().Name == "Forbidden.Assembly") 
{ 
    throw new Exception(...); 
}