0

実行時に DTO オブジェクトを逆シリアル化しています。そして、以下のコードを使用して、名前空間型名を指定してオブジェクトをインスタンス化しました

public class SimpleDtoSpawner : DtoSpawner{
    private readonly Assembly assembly;
    private readonly string nameSpace;

    public SimpleDtoSpawner(){
        assembly = Assembly.GetAssembly(typeof (GenericDTO));

        //NOTE: the type 'GenericDTO' is located in the Api namespace
        nameSpace = typeof (GenericDTO).Namespace ; 

    }

    public GenericDTO New(string type){
        return Activator.CreateInstance(
            assembly.FullName, 
            string.Format("{0}.{1}", nameSpace, type)
            ).Unwrap() as GenericDTO;
    }
}

すべてのコマンドとイベントApi名前空間にあるとき、この実装はうまくいきました。しかし、それらをApi.CommandApi.Event
の 2 つの名前空間に分けた後、正確な名前空間参照なしでそれらをインスタンス化する必要があります。

4

1 に答える 1

1

次のようなことができます。

public class SimpleDtoSpawner : DtoSpawner{
    private readonly Dictionary<string, Type> types;

    public SimpleDtoSpawner() {
        Assembly assembly = Assembly.GetAssembly(typeof (GenericDTO));
        string baseNamespace = typeof (GenericDTO).Namespace ; 
        types = assembly.GetTypes()
                        .Where(t => t.Namespace.StartsWith(baseNamespace))
                        .ToDictionary(t => t.Name);
    }

    public GenericDTO New(string type) {
        return (GenericDTO) Activator.CreateInstance(types[name]).Unwrap();
    }
}

同じ単純な名前を持つ同じ「ベース名前空間」の下に複数のタイプがある場合、辞書を作成するときにそれは大成功です。フィルターを変更して、タイプが割り当て可能かどうかを確認することGenericDTOもできます。

于 2012-07-19T09:34:16.817 に答える