2012-07-19 66 views
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.CommandApi.Event,我需要实例他们没有一个确切的命名空间引用。

+1

*为什么*无法指定*正确的*完整名称空间? – 2012-07-19 09:31:28

+0

New(string type)方法的参数仅包含Name类型(不是要实例化的Type的FullName)。这种类型可能是Command或Event。所以,鉴于这个信息我可以肯定,'基'命名空间肯定是'Api',但正确的(确切)N将是'Api.Command'或'Api.Event'。那有意义吗? – zirus 2012-07-19 09:39:08

回答

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