通用类型约束的条件逻辑

时间:2010-06-25 08:40:45

标签: types moq unity-container constraints generics

我正在尝试编写Unity的自动插件扩展程序。

虽然使用Windsor子依赖性解析器和RhinoMocks会更容易,但我被企业强迫使用Unity和Moq。

我还没有找到使用Moq的现有解决方案,而且我发现了原因。 Moq不能仅仅通过Type参数生成模拟,这会使Unity扩展变得困难,如果我尝试IUnity装饰器,当我到达时会遇到阻塞:

public T Resolve<T>()
{
    T instance;
    try
    {
        instance = _container.Resolve<T>();
    }
    catch(ResolutionFailedException)
    {
        // if T is reference type
        instance = new Mock<T>(MockBehavior.Loose).Object;
        // else
        // return default(T);
    }
    return instance;
}

问题是Moq作为引用类型的泛型类型约束。

问题在于注释中的条件逻辑是否可以以满足编译器的方式实现?

1 个答案:

答案 0 :(得分:1)

怎么样:

var type = typeof( T );
if ( type.IsInterface || type.IsClass )
{
    var mockType = typeof( Mock<> ).MakeGenericType( new[] { type } );
    var mock = (Mock) Activator.CreateInstance( mockType, MockBehavior.Loose );
    instance = (T) mock.Object;
}
else
{
    instance = default( T );
}