2010-06-25 17 views
0

J'essaye d'écrire une extension automocking de Unity.Logique conditionnelle sur les contraintes de type générique

Bien qu'il soit beaucoup plus facile d'utiliser un résolveur de sous-dépendance de Windsor et RhinoMocks, l'entreprise doit utiliser Unity et Moq.

Je n'ai pas trouvé une solution existante qui utilise Moq et j'ai découvert pourquoi. Moq ne peut pas générer des simulacres de seulement un paramètre de type, ce qui rend les extensions de Unity difficile et si je tente un décorateur IUnity je frappe un bloc quand je reçois ici:

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

Le problème est contrainte de type générique de Moq d'être un type de référence.

La question est de savoir si la logique conditionnelle dans les commentaires est possible d'une manière qui satisfera le compilateur?

Répondre

1

Que diriez-vous:

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

Ah. Je ne connaissais pas MakeGenericType. C'est parfait. Merci. –