我有一个通用类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
。
我已阅读以下文章:
我似乎没有得到如何处理我班级的这种约束。至于现在,我有以下几点:
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。我错过了一些明显的东西吗? =)
提前致谢!
答案 0 :(得分:3)
我想要的是强制,当我的通用类型DirectorySource是
DirectorySource<Group>
类型,我的搜索者是GroupSearcher。
为什么呢?那肯定是将搜索器功能封装到界面中的意义呢?您不应该关心实现是什么,只要它可以搜索正确的条目类型。
我认为构造函数约束在这里并不重要 - 这只会让你创建一个没有参数的T
的新实例......
编辑:我看不出你提出的问题实际上是一个问题。我们来看看代码:
IDirectorySearcher<User> userSearcher = new UserSearcher(ROOT, SCOPE);
IDirectorySource<Group> groups = new DirectorySource<Group>(userSearcher);
所以T
的{{1}}是DirectorySource<T>
。现在,构造函数将要求您传入Group
- IDirectorySearcher<Group>
不是,就我所见。所以这段代码不会编译,这就是你想要的。问题出在哪里?
答案 1 :(得分:2)
您是否考虑过:
public class DirectorySource<TValue, TSearcher>
where TValue : IDirectoryEntry
where TSearcher : IDirectorySearcher<T>, new()
{
public DirectorySource(TSearcher seacher)
{
Searcher = seacher
}
public TSearcher Searcher { get; private set; }
}
IDirectorySearcher<Group> groupSearcher = new GroupSearcher(ROOT, SCOPE);
var groups = new DirectorySource<Group, GroupSearcher>(groupSearcher);
答案 2 :(得分:1)
我认为,如果您向GetSource
添加IDirectorySearcher
方法,那么您将获得所需内容的唯一方法就是IDirectorySource<T>
返回{{1}}的实现