我正在尝试编写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作为引用类型的泛型类型约束。
问题在于注释中的条件逻辑是否可以以满足编译器的方式实现?
答案 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 );
}