【发布时间】:2010-07-13 20:17:41
【问题描述】:
我有一个泛型类 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#: Generic types that have a constructor?;
- An Introduction to C# Generics;
- new Constraint (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.我在这里遗漏了一些明显的东西吗? =)
提前致谢!
【问题讨论】:
-
@SLaks:我的 EDIT #1 是否更清楚?否则,我会努力做到这一点。
标签: c# generics constructor constraints