Условная логика на ограничениях родового типа - PullRequest
0 голосов
/ 25 июня 2010

Я пытаюсь написать автоматическое расширение Unity.

Хотя было бы намного проще использовать механизм разрешения зависимостей Windsor и RhinoMocks, я вынужден использовать Unity и Moq.

Я не нашел существующего решения, использующего Moq, и выяснил, почему. Moq не может генерировать mocks только из параметра 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 Ответ

1 голос
/ 26 июня 2010

Как насчет:

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 );
}
...