J'ai une classe générique DirectorySource<T>
qui dépend d'une interface IDirectorySearch<T>
.Contrainte constructeur sur les types génériques ou simplement vérifier la contrainte dans mon constructeur de type générique?
Les deux sont génériques et ont la même contrainte de type:
public class DirectorySource<T> where T : IDirectoryEntry { }
public interface IDirectorySearcher<T> where T : IDirectoryEntry { }
Ainsi, par exemple, quand je veux une source de manipuler des groupes, j'aller dans cette voie:
IDirectorySearcher<Group> groupSearcher = new GroupSearcher(ROOT, SCOPE);
IDirectorySource<Group> groups = new DirectorySource(groupSearcher);
Ce que je souhaite arriver à est de forcer, lorsque mon type générique DirectorySource<T>
est de type DirectorySource<Group>
, que mon chercheur est un GroupSearcher
, et je ne veux pas un être en mesure de passer dans un UserSearcher
, par exemple.
J'ai lu les articles suivants:
- C#: Generic types that have a constructor?;
- An Introduction to C# Generics;
- new Constraint (C# Reference).
Et je ne vois pas comment gérer ce genre de contrainte avec ma classe. Pour l'instant, je donne les résultats suivants:
public class DirectorySource<T> where T : IDirectoryEntry {
public DirectorySource(IDirectorySearcher<T> searcher) {
Searcher = searcher;
}
public IDirectorySearcher<T> Searcher { get; private set; }
}
Et puis, je les suivantes aussi:
public class GroupSearcher : IDirectorySearcher<Group> {
public GroupSearcher(DirectoryEntry root, SearchScope scope) {
NativeSearcher = new DirectorySearcher();
NativeSearcher.SearchRoot = root;
NativeSearcher.SearchScope = scope;
}
// Implementing interface...
}
Je ne peux pas simplement remplacer le type de propriété Searcher
, car cela causerait ma classe générique devenir non générique.
Une idée ou quelque chose que je n'ai pas compris correctement sur cette contrainte de constructeur sur la façon dont je devrais aller avec ce que je veux accomplir?
EDIT # 1
La raison pour laquelle je veux faire est que l'on peut faire ce qui suit:
IDirectorySearcher<User> userSearcher = new UserSearcher(ROOT, SCOPE);
IDirectorySource<Group> groups = new DirectorySource<Group>(userSearcher);
Cela me semble incorrect ...
1. Est-ce qu'il me manque quelque chose d'évident ici? =)
Merci d'avance!
Que demandez-vous exactement? – SLaks
@SLaks: Est-ce que cela devient plus clair avec mon ** EDIT # 1 **? Sinon, je m'efforcerai de le faire. –