StructureMap 在运行时解析泛型类型的所有实例

StructureMap resolve all instances for generic type at runtime

对于以下容器注册:

c.For(typeof(IHandler<bool>)).Use(typeof(BoolHandler));
c.For(typeof(IHandler<int>)).Use(typeof(IntHandler));

我正在尝试在 运行 时获取类型列表,如下所示:

var test = Container.Current.Get(typeof(IHandler<>)); // doesn't work
var test = Container.Current.GetAllInstances<IHandler<object>>(); // doesn't work

我计数为 0;

你不能调用Get(typeof(IHandler<>)),因为不可能创建一个开放泛型类型的实例;这在 CLR 中是不可能的。

解析 IHandler<object> 的集合只会在您显式注册 IHandler<object> 时产生任何元素 - 或者 - 当 IHandler<T> 被定义为协变时,即使用 out 关键字为 IHandler<out T>。如果您的界面上没有 inout 关键字,您的界面就不是变体,并且不可能将一个界面的封闭版本转换为同一界面的另一个封闭版本。

只有当抽象定义为 IHandler<out T> 时才可以将 IHandler<string> 分配给 IHandler<object> 因为 T 将是输出参数,而 string 可以转换为 object.

这不太可能对您有用,因为处理程序通常有一个输入参数。但是,当抽象定义为 IHandler<in T>(这更有意义)时,这意味着您只能从 IHandler<string> 分配 IHandler<object>,因为您可以将字符串参数传递给一个 IHandler<object> 但不是相反。

为了使这个更具体,将编译以下内容:

interface IHandler<in T> { }

var handlers = new IHandler<string>[]
{
    new Handler<string>(),
    new Handler<object>(),
};

但以下不会:

interface IHandler<in T> { }

var handlers = new IHandler<object>[]
{
    new Handler<string>(),
    new Handler<object>(),
};

同样,以下将编译:

interface IHandler<out T> { }

var handlers = new IHandler<object>[]
{
    new Handler<string>(),
    new Handler<object>(),
};

但以下不会:

interface IHandler<out T> { }

var handlers = new IHandler<string>[]
{
    new Handler<string>(),
    new Handler<object>(),
};

由于这通常适用于 C# 和 CLR,因此 StructureMap(或任何容器)无法解决此问题。这就是为什么你得不到任何结果的原因。