Я получаю исключение аргумента от Castle Dynamic Proxy, когда использую Moq для создания макета объекта, который реализует вложенный универсальный интерфейс с универсальным методом, который имеет ограничение интерфейса.
Исключением является: System.ArgumentException: невозможно установить родительский интерфейс.
Происходит при доступе к свойству объекта макета непосредственно после создания макета. (Стек вызовов находится внизу для удобства чтения)
Код прост и самоописан:
public interface A<T>
{
void Method<Z>() where Z : T;
}
public interface B
{
}
[Test]
public void MockNestedGenericInterfaceTest()
{
Mock<A<B>> mock = new Mock<A<B>>();
var o = mock.Object; //argument exception here
}
Тест не генерирует исключение, если предложение Z: T удалено.
Я провел некоторое исследование и нашел билет здесь . Я использую последние версии Moq и Castle.
Есть ли решение этой проблемы? Единственный способ, которым я вижу, как это работает - это ручная реализация. Насмешки с носорогом у меня тоже не сработали.
Спасибо.
Стек вызовов:
at System.Reflection.Emit.TypeBuilder.SetParent(Type parent)
в Castle.DynamicProxy.Generators.Emitters.GenericUtil.CopyGenericArguments (MethodInfo methodToCopyGenericsFrom, Словарь 2 name2GenericType, ApplyGenArgs genericParameterGenerator)
at Castle.DynamicProxy.Generators.Emitters.AbstractTypeEmitter.CopyGenericParametersFromMethod(MethodInfo methodToCopyGenericsFrom)
at Castle.DynamicProxy.Generators.InvocationTypeGenerator.Generate(ClassEmitter class, ProxyGenerationOptions options, INamingScope namingScope)
at Castle.DynamicProxy.Contributors.InterfaceProxyWithoutTargetContributor.GetInvocationType(MetaMethod method, ClassEmitter emitter, ProxyGenerationOptions options)
at Castle.DynamicProxy.Contributors.InterfaceProxyWithoutTargetContributor.GetMethodGenerator(MetaMethod method, ClassEmitter class, ProxyGenerationOptions options, OverrideMethodDelegate overrideMethod)
at Castle.DynamicProxy.Contributors.CompositeTypeContributor.ImplementMethod(MetaMethod method, ClassEmitter class, ProxyGenerationOptions options, OverrideMethodDelegate overrideMethod)
at Castle.DynamicProxy.Contributors.CompositeTypeContributor.Generate(ClassEmitter class, ProxyGenerationOptions options)
at Castle.DynamicProxy.Generators.InterfaceProxyWithoutTargetGenerator.GenerateType(String typeName, Type proxyTargetType, Type[] interfaces, INamingScope namingScope)
at Castle.DynamicProxy.Generators.InterfaceProxyWithTargetGenerator.GenerateCode(Type proxyTargetType, Type[] interfaces, ProxyGenerationOptions options)
at Castle.DynamicProxy.ProxyGenerator.CreateInterfaceProxyWithoutTarget(Type interfaceToProxy, Type[] additionalInterfacesToProxy, ProxyGenerationOptions options, IInterceptor[] interceptors)
at Moq.Proxy.CastleProxyFactory.CreateProxy(ICallInterceptor interceptor, Type[] interfaces, Object[] arguments)
at Moq.Mock
1.b__0 ()
в Moq.Mock 1.InitializeInstance()
at Moq.Mock
1.OnGetObject ()
в Moq.Mock`1.get_Object ()