[英]How to instantiate objects given a Class name and a base Namespace
我在运行时反序列化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 ,我需要在没有确切名称空间引用的情况下实例化它们。
您可以执行以下操作:
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
。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.