4

これについて手を貸していただければ幸いです。もうかなり前から悩んでいます。ウェブ上で決定的な答えが見つかりません。私は単純なクラス階層を持っています: ClassA、ClassB、および DefaultClass を派生させた BaseClass です。それらはすべて、 ClassA(Input input) : base(input) のようなコンストラクターを持っています...すべて非常に単純です。今、私は次の工場を持っています

namespace mynamespace
{
    public class Factory
    {

        public static Dictionary<string, Type> Map = 
        new Dictionary<string, Type>
        {
            {"ClassA", typeof(ClassA)},
            {"ClassB", typeof(ClassB)}
        };
        public static BaseClass Create(Input input)
        {
            Type constructor;
            try
            {
                constructor = Map[input.ClassType];
            }
            catch (KeyNotFoundException)
            {
                constructor = typeof(DefaultClass);
            }
            return (BaseClass) Activator.CreateInstance(constructor, input);
        }
    }
}

ご覧のとおり、入力オブジェクトの .ClassType メンバーによって、インスタンス化されるクラスが決まります。このタイプのコンストラクトは、次のような単純な呼び出しで機能しています

var myClass = Factory.Create(input);

私のスタンドアロンアプリケーションで。ここで、アプリケーションをサーバー上で実行する必要があり、Create メソッドの呼び出しによって、シリアル化された入力オブジェクトがクライアントから受信されます。それが、機能するアプリケーションと機能しないアプリケーションの唯一の違いだと思います。さて、入力は線に沿ったものです

[DataContract]
public class Input
{
    [DataMember] public string ClassType;
    [DataMember] public string member1;
}

以前は、そのような DataContract または DataMember 注釈はありませんでした。さて、コードが Activator.CreateInstance 行でクラッシュし、「指定されたキーが辞書に存在しませんでした」という例外が発生しました。これがなぜなのか、何か手がかりはありますか?唯一の違いは、コンストラクター内のシリアル化されたオブジェクトです。

よろしくお願いします。

4

1 に答える 1

5

あなたが提供したコードスニペットは正常に動作するはずです。オブジェクトのコンストラクターを調べます。実装内のどこかで例外が発生していると確信しています。

そして、例外をキャッチする代わりに Dictionary.TryGetValue() を使用する方がよいことに完全に同意します。例外を学ぶための便利なリンクは次のとおりです: Exception Handling

于 2012-06-22T08:57:11.577 に答える