У меня есть универсальный класс DirectorySource<T>
, который зависит от интерфейса IDirectorySearch<T>
.
Оба являются обобщенными и имеют одинаковое ограничение типа:
public class DirectorySource<T> where T : IDirectoryEntry { }
public interface IDirectorySearcher<T> where T : IDirectoryEntry { }
Так, например, когда я хочу, чтобы источник манипулировал группами, я бы пошел следующим образом:
IDirectorySearcher<Group> groupSearcher = new GroupSearcher(ROOT, SCOPE);
IDirectorySource<Group> groups = new DirectorySource(groupSearcher);
То, что я хочу придумать, - это заставить, когда мой универсальный тип DirectorySource<T>
относится к типу DirectorySource<Group>
, что мой поисковик - GroupSearcher
, и я не хочу, чтобы один мог передать его UserSearcher
, например.
Я прочитал следующие статьи:
- C #: универсальные типы, имеющие конструктор? ;
- Введение в C # Generics ;
- новое ограничение (C # Reference) .
И я, похоже, не понимаю, как справиться с такого рода ограничениями в моем классе. На данный момент у меня есть следующее:
public class DirectorySource<T> where T : IDirectoryEntry {
public DirectorySource(IDirectorySearcher<T> searcher) {
Searcher = searcher;
}
public IDirectorySearcher<T> Searcher { get; private set; }
}
А потом у меня тоже следующее:
public class GroupSearcher : IDirectorySearcher<Group> {
public GroupSearcher(DirectoryEntry root, SearchScope scope) {
NativeSearcher = new DirectorySearcher();
NativeSearcher.SearchRoot = root;
NativeSearcher.SearchScope = scope;
}
// Implementing interface...
}
Я не могу просто заменить тип свойства Searcher
, так как это приведет к тому, что мой универсальный класс станет неуниверсальным.
Любая идея или что-то, что я не правильно понял об этом ограничении конструктора о том, как я должен идти с тем, чего я хочу достичь?
РЕДАКТИРОВАТЬ # 1
Причина, по которой я хочу это сделать, заключается в том, что можно сделать следующее:
IDirectorySearcher<User> userSearcher = new UserSearcher(ROOT, SCOPE);
IDirectorySource<Group> groups = new DirectorySource<Group>(userSearcher);
Мне кажется, это неправильно ...
1. Я что-то упускаю здесь очевидное? =)
Заранее спасибо!