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,我需要在没有确切命名空间引用的情况下实例化它们。

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 回答