繁体   English   中英

如何实例化给定类名称和基本命名空间的对象

[英]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.CommandApi.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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM