1

OK、名前を使用してクラスを作成する方法について検索し、いくつかの質問を見ました。私の質問はまったく同じではないので、とにかく質問します。

私のアプリケーションには、「A」と「B」の2つのクラスがあります。別のクラスでは、これら2つのクラスを使用する必要があります(3番目のクラスは外部サービスによって呼び出されます)。外部サービスは、2つの「A」クラスと「B」クラスの名前のみを文字列として渡します。3番目のクラスでは、次のようなことができることを知っています。

case "A":
    create an instance of A
case "B":
    create an instance of B

しかし、それは奇妙に思えます。動的に実行したいので、Activator.CreateInstanceを実行することを考えていましたが、アセンブリをリモートでロードするときに「CreateInstance」が使用されているように見えるため、プログラミングが適切かどうかはわかりません。私の場合、すべてが1つのプロジェクトに含まれています。

何かアドバイス?どうもありがとう!

4

2 に答える 2

2

名前で作成するクラスの数が限られている場合(例では2つの異なるクラスなど)、「スイッチ」を使用する方法をお勧めします。

public object ClassFactory(string ClassName)
{
    switch(ClassName)
    {
        case "A": return new A();
        case "B": return new B();
    }
}

より高速で安全だからです(クラスの名前が外部サービスからのものである場合、このサービスが悪意のあるクラス名を送信するとどうなるか想像してみてください)。

それ以外の場合、Activator.CreateInstanceは問題を起こさないはずですが、入力を徹底的に確認してください。

于 2012-05-18T19:39:35.250 に答える
1

これは、ファクトリメソッドパターンを使用するのに最適なケースです。

http://www.dofactory.com/Patterns/PatternFactory.aspx

于 2012-05-18T19:51:38.350 に答える