首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >System.Type参数上的ParameterOverride失败

System.Type参数上的ParameterOverride失败
EN

Stack Overflow用户
提问于 2011-04-09 04:34:17
回答 2查看 1.8K关注 0票数 7

我正在尝试使用带有Unity2.0的ParameterOverride。只要我提供的参数不是System.Type,它就可以正常工作。

在下面的测试程序中,当泛型参数T是int时,我用一个整数参数将构造函数注入到MyClass<T>,当T是System.Type时,我用一个类型参数将构造函数注入到Type。在下面的输出中,您将看到它很好地处理了整数,但似乎认为typeof(MyClassForParam)是一个实际的MyClassForParam对象,而不是类型。有什么想法吗?

代码语言:javascript
复制
namespace UnityParameterOverride
{
    interface IMyClass
    {
    }

    public class MyClass<T> : IMyClass
    {
        public MyClass(T myParam)
        {
            Console.WriteLine("{0}", myParam);
        }
    }

    public class MyClassForParam
    {
        public MyClassForParam() { }
    }

    class Program
    {
        static void Main(string[] args)
        {
            IUnityContainer unity = new UnityContainer();
            try
            {
                // Works fine: prints 12345
                Console.WriteLine("Injecting an integer parameter.");
                unity.RegisterType<IMyClass, MyClass<int>>();
                unity.Resolve<IMyClass>(new ParameterOverride("myParam", 12345));

                // Fails: Seems to think that the parameter is an actual MyClassForParam instead of the type of that class.
                Console.WriteLine();
                Console.WriteLine("Injecting a Type parameter.");
                unity.RegisterType<IMyClass, MyClass<Type>>();
                unity.Resolve<IMyClass>(new ParameterOverride("myParam", typeof(MyClassForParam)));
            }
            catch (Exception ex)
            {
                Console.WriteLine(ex.Message);
            }
            Console.ReadLine();
        }
    }
}

输出如下:

代码语言:javascript
复制
Injecting an integer parameter.
12345

Injecting a Type parameter. ----
Resolution of the dependency failed, type = "UnityParameterOverride.IMyClass", name = "(none)".

发生异常的时间:

代码语言:javascript
复制
Exception occurred while: Resolving parameter "myParam" of constructor UnityParameterOverride.MyClass`1[[System.Type, mscorlib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089]](System.Type myParam).
Exception is: InvalidCastException - Unable to cast object of type 'UnityParameterOverride.MyClassForParam' to type 'System.Type'.

在发生异常时,容器是:

代码语言:javascript
复制
Resolving UnityParameterOverride.MyClass1[System.Type],(none) (mapped from Un ityParameterOverride.IMyClass, (none)) Resolving parameter "myParam" of constructor UnityParameterOverride.MyClass1[ [System.Type, mscorlib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c5 61934e089]](System.Type myParam)
EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2011-04-09 05:48:32

Unity对类型参数定义进行了特殊处理。有关更多细节,请参阅Krzysztof Kozmic的这篇文章:http://kozmic.pl/2008/12/03/unity-framework-and-the-principle-of-the-least-surprise/

票数 8
EN

Stack Overflow用户

发布于 2012-04-06 04:36:08

我在Unity中进行了一些探索后遇到了同样的问题,我发现你可以通过用InjectionParameter包装裸类型参数来覆盖默认的类型解析行为:

代码语言:javascript
复制
new ParameterOverride("typeParameterArgument",new InjectionParameter(typeof(Type),typeof(MyNamespace.MyClassUsedAsInjectedTypeArgument)))

ParameterOverride的构造函数使用InjectionParameterValue.ToParameter(),它将遵循InjectionParameterValue的任何预定义的子类。当使用在构造过程中使用相同方法的PropertyOverride时,此方法也应该有效。

票数 4
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/5600488

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档