代码之家  ›  专栏  ›  技术社区  ›  Will Marcouiller

泛型类型上的构造函数约束还是只检查泛型类型构造函数中的约束?

  •  1
  • Will Marcouiller  · 技术社区  · 14 年前

    我有一个泛型类 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<Group> GroupSearcher UserSearcher ,例如。

    1. C#: Generic types that have a constructor? ;
    2. An Introduction to C# Generics ;
    3. 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);
    

    我觉得这不正确。。。

    提前谢谢!

    3 回复  |  直到 7 年前
        1
  •  3
  •   Jon Skeet    14 年前

    当我的泛型类型DirectorySource是 DirectorySource<Group> 键入,我的搜索者是GroupSearcher。

    为什么?这与将searcher功能封装到接口中的观点背道而驰,是吗?您不应该关心实现是什么,只要它可以搜索正确类型的条目。

    我不认为构造函数约束在这里是真正相关的-这只允许您创建 T 没有争论。。。

    事实上 一个问题。让我们看看代码:

    IDirectorySearcher<User> userSearcher = new UserSearcher(ROOT, SCOPE);
    IDirectorySource<Group> groups = new DirectorySource<Group>(userSearcher);
    

    所以这里是 T型 对于 DirectorySource<T> Group . 现在构造函数将要求您传入 IDirectorySearcher<Group> userSearcher 在我看来,不是。所以这段代码不会编译,这就是你想要的。问题出在哪里?

        2
  •  2
  •   James Curran    14 年前

    您是否考虑过:

    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); 
    
        3
  •  1
  •   Donnie    14 年前

    GetSource 方法 IDirectorySearcher IDirectorySource<T> .