【问题标题】:Unity: how to resolve derived types into IEnumerable?Unity:如何将派生类型解析为 IEnumerable?
【发布时间】:2012-02-22 17:54:20
【问题描述】:

我有基类和几个派生类。如何通过 Unity 将这些派生类型解析为 IEnumerable 集合?我已经尝试过像

var myObjectList = (IEnumerable<BaseClass>) UnityContainerFactory.UnityContainer.ResolveAll(typeof(BaseClass));

但它引发了一个 invalidCastException

【问题讨论】:

    标签: c# unity-container ioc-container


    【解决方案1】:

    您应该只使用ResolveAll 的泛型重载。

    var myObjectList = UnityContainerFactory.UnityContainer
                                            .ResolveAll<BaseClass>();
    

    或者,使用Enumerable.Cast:

    var myObjectList = UnityContainerFactory.UnityContainer
                                            .ResolveAll(typeof(BaseClass))
                                            .Cast<BaseClass>();
    

    【讨论】:

    • 我选择了第二个变体。没有更多的例外,但容器仍然是空的。我以以下方式注册类型: container.RegisterType(); container.RegisterType();
    • 已编辑:我注册了未命名的类型,这就是容器为空的原因。不过,谢谢!
    【解决方案2】:

    我没有使用过 Unity,但假设您使用的是 .NET 3.5 或更高版本,您可以尝试使用 LINQ:

    var myObjectList = UnityContainerFactory.UnityContainer
                                            .ResolveAll(typeof(BaseClass))
                                            .Cast<BaseClass>();
    

    (您可能需要调用ToList() 将其具体化为List&lt;BaseClass&gt;。)

    【讨论】:

    • 我写了一个扩展方法,用于一次调用转换为列表:public static List&lt;T&gt; ToCastedList&lt;T&gt;(this IEnumerable e) { return e.Cast&lt;T&gt;().ToList(); }
    猜你喜欢
    • 1970-01-01
    • 2013-05-18
    • 2022-06-10
    • 1970-01-01
    • 2017-03-19
    • 1970-01-01
    • 2018-08-16
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多