2010-06-25 9 views
0

Unity의 automocking 확장을 쓰려고합니다.일반 형식 제약 조건 조건 논리

Windsor 하위 종속성 해결 프로그램과 RhinoMock을 사용하는 것이 훨씬 쉬울 지 모르지만 저는 사업부에서 Unity 및 Moq을 사용해야합니다.

Moq를 사용하는 기존 솔루션을 찾지 못했지만 이유를 발견했습니다. MOQ 어려운 유니티 확장을 만드는 단지 유형 매개 변수에서 모의 ​​객체를 생성 할 수 없습니다와 내가 블록을 명중 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

방법에 대해 :

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); 
} 
+0

아. 나는 MakeGenericType에 대해 몰랐다. 저건 완벽 해. 감사. –