2009-10-14 9 views
1

J'ai une interface comme suit:.« en utilisant le type générique .... <T> requiert 1 argument de type et des contraintes génériques multiples et utilisant

public interface ITestCase<T> where T : HtmlControl 
{ 
    IEnumerable<T> Execute(Manager manager); 
} 

HtmlControl est une classe de base à partir d'un assemblage 3ème partie

J'ai deux implémentations de cette interface.

l'un d'eux est de retour nul (spécifié par moi), jusqu'à ce que je cloue la logique nécessaire (pas une tâche difficile).

Le problème est, ce que j'appelle 2me de la codebehind de ma forme:

var LoginJuniper = new Login<ArtOfTest.WebAii.Controls.HtmlControls.HtmlDiv>(); 
LoginProcedure.Login(textBox1.Text, new Test1()); 

La classe de connexion, et toutes les autres classes, prendre le même argument de contrainte de type (où T est HtmlControl, et tous de la API tierce).

En outre, l'autre problème que j'ai rencontré est lorsque j'utilise plusieurs contraintes de type; est-il possible de dire que T peut être l'un ou l'autre de ces contraintes? Par exemple. si j'ai:

<T> where T : HtmlControl, IElement 

Puis-je passer tout type qui peut être une mise en œuvre de IElement et non HtmlControl, ou vice versa? Via seulement l'interface 1. Cela serait très utile car je voulais passer plus de types à ma contrainte de type générique parce que l'inteface et les cas de test que je dérive de l'interface peuvent tester plus que les classes HtmlControls (peut aussi tester les implémentations IElements comme dans l'API tierce me permet d'obtenir des captures d'écran et je voudrais tester ces captures d'écran (obtenir des pixels, affirmer que la couleur est correcte)).

Merci

+1

Pouvez-vous publier un seul programme complet qui illustre le problème? –

+0

Il n'y a pas le réglage correct pour les détails dans cette question. Essayez de vous concentrer sur le problème principal, laissez les autres questions à une autre question si nécessaire plus tard. Montrez-nous la classe en utilisant ITestCase et l'appel à Exécuter. – AnthonyWJones

+0

Je vais reposer le problème principal dans un fil séparé. Merci. – csharpdev

Répondre

1

Je ne suis pas sûr exactement ce que vous voulez la réponse à (peut-être vous pourriez essayer résumer vos questions réelles).

Toutefois, dans le cas d'utilisation de plusieurs types de contraintes, le doc MSDN dit:

En limitant le paramètre de type, vous augmentez le nombre d'opérations admissibles et appels de méthode à ceux pris en charge par la contrainte tapez et tous les types dans son héritage hiérarchie. Par conséquent, lorsque vous concevez classes génériques ou des méthodes, si vous effectuerez toute opération sur les membres génériques simples au-delà de l'affectation ou d'appeler des méthodes non pris en charge par System.Object, vous doivent appliquer des contraintes du type paramètre.

Ce qui signifie essentiellement que l'objet T doit implémenter toutes les contraintes que vous fournissez. Donc, vous ne pouvez pas utiliser la méthode sur un type qui n'est pas dérivé de HtmlControlet implémente IElement.

Il y a un moyen de contourner cela, mais ce n'est pas joli, et vous pourriez aussi bien diviser les choses.Mais vous pouvez le faire:

void Foo<T>(T arg) 
{ 
    if (arg is IElement) 
    { 
    var argAsIElement = arg as IElement; 

    // Do something with argAsIElement 
    } 
    if (arg is HtmlControl) 
    { 
    var argAsHtmlControl = arg as HtmlControl; 

    // Do something with argAsHtmlControl 
    } 
} 
+1

Une autre solution consiste à créer une implémentation de IElement qui enveloppe un HtmlControl (un adaptateur) et l'utilise avec une contrainte T: IElement dans la méthode – thecoop

Questions connexes