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

时间:2010-07-13 20:17:41

标签: c# generics constructor constraints

我有一个通用类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

我已阅读以下文章:

  1. C#: Generic types that have a constructor?;
  2. An Introduction to C# Generics;
  3. new Constraint (C# Reference)
  4. 我似乎没有得到如何处理我班级的这种约束。至于现在,我有以下几点:

    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。我错过了一些明显的东西吗? =)

    提前致谢!

3 个答案:

答案 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}}的实现