【问题标题】:IUnityContainer.Resolve<T> throws error claiming it cannot be used with type parametersIUnityContainer.Resolve<T> 抛出错误,声称它不能与类型参数一起使用
【发布时间】:2011-02-21 22:58:16
【问题描述】:

昨天我已经实现了代码:

CustomerProductManager productsManager = container.Resolve<CustomerProductManager>();

它是可编译和工作的。

今天(可能我修改了一些东西)我经常收到错误:

非泛型方法 'Microsoft.Practices.Unity.IUnityContainer.Resolve(System.Type, 字符串,参数 Microsoft.Practices.Unity.ResolverOverride[])' 不能与类型参数一起使用

我的同事有相同的源代码并且没有相同的错误。为什么?如何解决问题?

附:

行“使用 Microsoft.Practices.Unity;”存在于使用部分中。

我尝试用非通用版本替换通用版本:

CustomerProductManager productsManager = (CustomerProductManager)container.Resolve(typeof(CustomerProductManager));

又遇到了一个错误:

“解决”方法没有重载 '1' 参数

似乎其中一个程序集没有被引用..但是哪一个?我有两个参考: 1.Microsoft.Practices.Unity.dll 2. Microsoft.Practices.ServiceLocation.dll

P.P.S.我看到了类似的问题http://unity.codeplex.com/WorkItem/View.aspx?WorkItemId=8205,但它被解决为“不是错误”

任何想法都会有所帮助

【问题讨论】:

  • 你在使用 Unity 2.0 吗?
  • 您可能会发现是 Power Commands 插件使用子句删除未使用的命名空间;当您的代码处于不可编译状态并且您可能有在编辑期间保存文件的习惯时,命名空间是“未使用的”——并且插件在保存时删除了额外的使用。

标签: c# .net generics unity-container compilation


【解决方案1】:

我遇到了同样的问题,并在查看 Prism 示例代码文件时找到了“修复”。看起来,即使它不是 Unity V2 中的 dll,您也必须在您的类中添加一个引用: Microsoft.Practices.Unity

我完整的“使用”部分如下

using System;
using System.Windows;
using Microsoft.Practices.Composite.Modularity;
using Microsoft.Practices.Unity;
using Microsoft.Practices.Composite.UnityExtensions;

我不确定您是否使用 Silverlight,但 Microsoft.Practices.Unity 中的 Container.Resolve IS 的通用版本。

【讨论】:

  • 没错。前段时间我检测到添加“使用 Microsoft.Practices.Unity;”解决了一个问题。
  • 这对我也有用,但该死的 resharper 现在正在抱怨未使用的“使用指令”。
  • 原因是带类型参数的Resolve是Microsoft.Practices.Unity中的扩展方法,而不带类型参数的Resolve()只是接口(或类)上的一个方法。
  • 谢谢!这么多年过去了,这只是发生在全新的代码上。 HttpClient 与这些“隐藏”扩展秘密的方式相同。不是粉丝。我喜欢简单的注射器。
  • FWIW,在据称高度兼容的新 Unity 5 中,命名空间现在是 Unity 而不是 Microsoft.Practices.Unity
【解决方案2】:

在我的情况下,我用 Unity 包装的类继承自一个抽象基类,并且该基类 NOT 具有无参数构造函数。一旦我将代码更改为对基类使用无参数构造函数,问题就消失了。

【讨论】:

    【解决方案3】:

    我遇到了这个问题,这些答案都没有帮助我。我收到编译时错误

    未知方法RegisterType()的 Microsoft.Practices.Unity.IUnityContainer

    对于我下面的代码。

    Container.RegisterType&lt;IMyInterface, MyClass&gt;();

    我发现如果你没有在 MyClass 类中实现 IMyInterface,你就会遇到这个问题。 希望它也能为您解决...

    【讨论】:

      【解决方案4】:

      在我的情况下,我让 Bootstrapper 在没有通用版本的情况下实现了自己的 Resolve,因此它找不到 Microsoft 的 Unity Resolve。添加正确的用法就可以了。

      【讨论】:

        【解决方案5】:

        Microsoft 不再拥有 Unity,它在第 5 版中,命名空间现在是:

        using Unity;
        

        使用时确保在您的使用部分中:

        container.Resolve<T>();
        

        【讨论】:

        • 请注意,如果您使用的是 Prism,当前稳定版本 (6.3.0) 的 Prism still 使用 Unity 4.0.1,您仍然需要 @987654323 @
        • 说真的,这个把我逼疯了。谢谢!
        猜你喜欢
        • 1970-01-01
        • 2012-07-18
        • 2013-01-03
        • 2014-04-20
        • 2011-10-19
        • 1970-01-01
        • 1970-01-01
        • 2021-11-12
        • 1970-01-01
        相关资源
        最近更新 更多