如何在给定类名和基本命名空间的情况下实例化对象

时间:2012-07-19 09:29:03

标签: c# reflection instantiation

我在运行时反序列化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 ,我需要实例化它们没有确切的命名空间参考。

1 个答案:

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