Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/azure/12.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Types 泛型类型约束的条件逻辑_Types_Moq_Unity Container_Constraints_Generics - Fatal编程技术网

Types 泛型类型约束的条件逻辑

Types 泛型类型约束的条件逻辑,types,moq,unity-container,constraints,generics,Types,Moq,Unity Container,Constraints,Generics,我正在尝试编写Unity的自动模拟扩展 虽然使用Windsor子依赖解析程序和Rhinomock要容易得多,但业务迫使我使用Unity和Moq 我还没有找到使用Moq的现有解决方案,我已经找到了原因。 Moq不能仅从一个类型参数生成模拟,这使得Unity扩展很困难,如果我尝试使用IUnity装饰器,我在这里遇到了一个障碍: public T Resolve<T>() { T instance; try { instance = _contain

我正在尝试编写Unity的自动模拟扩展

虽然使用Windsor子依赖解析程序和Rhinomock要容易得多,但业务迫使我使用Unity和Moq

我还没有找到使用Moq的现有解决方案,我已经找到了原因。 Moq不能仅从一个类型参数生成模拟,这使得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;
}
public T Resolve()
{
T例;
尝试
{
实例=_container.Resolve();
}
捕获(解决失败异常)
{
//如果T是引用类型
instance=newmock(MockBehavior.Loose).Object;
//否则
//返回默认值(T);
}
返回实例;
}
问题是Moq的泛型类型约束是引用类型

问题是注释中的条件逻辑是否能够满足编译器的要求?

如何:

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 );
}
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;
}
其他的
{
实例=默认值(T);
}

Ah。我不知道MakeGenericType。太好了。谢谢