2009-07-22 6 views
0

J'ai travaillé sur un générateur de code pour mes projets et, bien que tout a bien fonctionné. Mais maintenant, je suis tombé sur un détail que je ne suis pas sûr de savoir comment résoudre. C'est pour ma couche DAL, qui est destinée à permettre des implémentations pour diferente dataSources.C# Classes partielles génériques, interfaces, AND héritage, toutes dans la même question! (oh mon!)

donc j'ai une interface:

public interface IUsersDALBase 
{ 
    //defined methods 
} 

une classe générique qui implémente:

public class UsersDALBase<T> : DBDataAccessBase where T : DBDataAccessBase, IUsersDALBase, new() 
{ 
    protected T _UsersInstance = default(T); 

    public string connectionString 
    { 
     get { return _UsersInstance.connectionString; } 
     set { _UsersInstance.connectionString = value; } 
    } 

    //constructors (...) 

    //interface method implementations, that call _UsersInstance methods (...) 
} 

Pour référence, DBDataAccessBase ne détient que la chaîne de connexion et a la disposition des méthodes pour normaliser le * Classes DALBAse. Il y a aussi une définition dérivée vide étendue (et là pour ne pas avoir besoin du suffixe « Base »):

public partial class UsersDAL<T> : UsersDALBase<T> where T : DBDataAccessBase, IUsersDALBase, new() 
{ 
    //empty in generated file 
} 

cette classe est juste une enveloppe autour UsersDALBase et est celui que je veux étendre dans un nouveau fichier. Les classes de type T sont principalement générées automatiquement, mais avec des implémentations spécifiques à DB.

Donc finalement, je veux étendre UsersDAL dans un autre fichier avec des méthodes personnalisées que le code généré ne fonctionne pas et représenté par une nouvelle interface

public interface IUsers2 
{ 
    UsersList GetAppRoleUsers(int NS_AppRole); 
} 

J'essaie quelque chose comme:

public partial class UsersDAL<T> : UsersDALBase<T> where T : DBDataAccessBase, IUsers2, new() 
{ 
    //interface method implementation 

    //compile error: Partial declarations of 'DAL.UsersDAL<T>' have inconsistent 
    //constraints for type parameter 'T' -supose i can't have diferente interface 
    //implementations for T... 

} 

Je veux fondamentalement que UserDAL ait toutes les méthodes autogénérées (qui implémentent IUsersDALBAse) et les méthodes que j'ai définies dans la nouvelle interface IUsers2. Des idées sur comment je peux obtenir ceci ???

Merci!

Répondre

3

Si plusieurs fichiers spécifient des contraintes de type, ces contraintes doivent correspondre, j'en ai peur.

De section 10.2.3 de la spécification C# 3:

Lorsqu'un type générique partiel déclaration comprend des contraintes (clauses where), les contraintes doivent d'accord avec toutes les autres parties qui comprennent les contraintes. Plus précisément, chaque partie qui inclut des contraintes doit avoir des contraintes pour le même ensemble de paramètres de type, et pour chaque paramètre de type les ensembles de primaires, secondaires , et les contraintes constructeur doit être équivalente. Deux ensembles de contraintes sont équivalents s'ils contiennent les mêmes membres. Si aucune partie d'un type générique partiel spécifie les contraintes de paramètre de type, les paramètres de type sont considérés comme sans contrainte.

Pourriez-vous fournir des interfaces supplémentaires que vous voulez dans la déclaration de classe partielle en tant qu'entrée dans le générateur de code?

+0

actuellement, non, mais je suppose que je devrais l'inclure dans la prochaine itération. Mon travail pour cela maintenant est juste d'implémenter un ensemble spécifique de classes pour la nouvelle interface. Un peu comme une implémentation de responsabilité unique. Merci pour la clarification. – MytyMyky