Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/.net/21.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 使用structuremap当我只有类型名中的字符串时,如何解析类型_C#_.net_Structuremap - Fatal编程技术网

C# 使用structuremap当我只有类型名中的字符串时,如何解析类型

C# 使用structuremap当我只有类型名中的字符串时,如何解析类型,c#,.net,structuremap,C#,.net,Structuremap,我需要使用插件模型,其中我需要允许structuremap创建ITask类型,但在运行时我只有一个类型名字符串。这些类型需要使用Ctor注入来组合,因此我无法构建现有类型 另外,我不想获取所有类型,然后查询类型名,因为它们的构造成本可能会很高 是否缺少任何内置功能?您可以使用ObjectFactory.GetNamedInstanceCustomer 建议的方法是将其隐藏在Factory类后面: public interface IPersonFactory { IPerson GetP

我需要使用插件模型,其中我需要允许structuremap创建ITask类型,但在运行时我只有一个类型名字符串。这些类型需要使用Ctor注入来组合,因此我无法构建现有类型

另外,我不想获取所有类型,然后查询类型名,因为它们的构造成本可能会很高

是否缺少任何内置功能?

您可以使用ObjectFactory.GetNamedInstanceCustomer

建议的方法是将其隐藏在Factory类后面:

public interface IPersonFactory
{
    IPerson GetPersonInstance(string name);
}

public class StructureMapPersonFactory : IPersonFactory
{
    public IPerson GetPersonInstance(string name)
    {
        return ObjectFactory.GetNamedInstance<IPerson>(name);
    }
}

我还没试过,但也许你可以用Type.GetType,比如

var task = (ITask)ObjectFactory.GetInstance(Type.GetType("Assembly.Qualified.Name.Of.Type"));
这假定您知道类型的程序集/名称空间

另一种可能性

在你的扫描仪中添加这个

Scan(x =>
{
    x.AddAllTypesOf<ITask>();
}
然后,在某个解析器类中

private Dictionary<string, Type> typeLookup;
public ITask GetInstance(string typeName)
{
    if (typeLookup == null)
    {
        typeLookup = new Dictionary<string, Type>();
        var tasks = ObjectFactory.GetAllInstances<ITask>();
        foreach (var task in tasks)
        {
            typeLookup.Add(task.GetType().Name, task.GetType());
        }

    }
    return (ITask)ObjectFactory.GetInstance(typeLookup[typeName]);
}

我添加了另一个您可能想签出的选项。我最后做了类似的事情,我查询了模型属性,并使用link从那里获取任务,然后使用get创建具体的实现
private Dictionary<string, Type> typeLookup;
public ITask GetInstance(string typeName)
{
    if (typeLookup == null)
    {
        typeLookup = new Dictionary<string, Type>();
        var tasks = ObjectFactory.GetAllInstances<ITask>();
        foreach (var task in tasks)
        {
            typeLookup.Add(task.GetType().Name, task.GetType());
        }

    }
    return (ITask)ObjectFactory.GetInstance(typeLookup[typeName]);
}