我在运行时反序列化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.Command 和 Api.Event ,我需要实例化它们没有确切的命名空间参考。
答案 0 :(得分: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();
}
}
如果在同一个“base namespace”下有多个类型且具有相同的简单名称,那么在创建字典时会发生这种情况。您可能还想更改过滤器以检查该类型是否也可分配给GenericDTO
。