C# 泛型类型上的构造函数约束,还是只检查泛型类型构造函数中的约束?
我有一个泛型类C# 泛型类型上的构造函数约束,还是只检查泛型类型构造函数中的约束?,c#,generics,constructor,constraints,C#,Generics,Constructor,Constraints,我有一个泛型类DirectorySource,它依赖于接口IDirectorySearch 两者都是泛型,具有相同的类型约束: public class DirectorySource<T> where T : IDirectoryEntry { } public interface IDirectorySearcher<T> where T : IDirectoryEntry { } 然后,我还有以下几点: public class GroupSearcher :
DirectorySource
,它依赖于接口IDirectorySearch
两者都是泛型,具有相同的类型约束:
public class DirectorySource<T> where T : IDirectoryEntry { }
public interface IDirectorySearcher<T> where T : IDirectoryEntry { }
然后,我还有以下几点:
public class GroupSearcher : IDirectorySearcher<Group> {
public GroupSearcher(DirectoryEntry root, SearchScope scope) {
NativeSearcher = new DirectorySearcher();
NativeSearcher.SearchRoot = root;
NativeSearcher.SearchScope = scope;
}
// Implementing interface...
}
这对我来说似乎不正确
1。我是不是错过了一些明显的东西?=)强>
提前谢谢
当我的泛型类型DirectorySource为
DirectorySource
type,我的搜索者是一个GroupSearcher
为什么??这与将searcher功能封装到接口中的观点背道而驰,是吗?您不应该关心实现是什么,只要它可以搜索正确类型的条目
我不认为构造函数约束在这里是真正相关的-这只允许您创建一个没有参数的t
的新实例
编辑:我看不出你提出的问题实际上是个什么问题。让我们看看代码:
IDirectorySearcher<User> userSearcher = new UserSearcher(ROOT, SCOPE);
IDirectorySource<Group> groups = new DirectorySource<Group>(userSearcher);
IDirectorySearcher userSearcher=新用户搜索器(根,范围);
IDirectorySource组=新目录源(userSearcher);
因此这里DirectorySource
的T
是Group
。现在,构造函数将要求您传入一个IDirectorySearcher
——据我所知,userSearcher
不是。所以这段代码不会编译,这正是您想要的。问题出在哪里
当我的泛型类型DirectorySource为
DirectorySource
type,我的搜索者是一个GroupSearcher
为什么??这与将searcher功能封装到接口中的观点背道而驰,是吗?您不应该关心实现是什么,只要它可以搜索正确类型的条目
我不认为构造函数约束在这里是真正相关的-这只允许您创建一个没有参数的t
的新实例
编辑:我看不出你提出的问题实际上是个什么问题。让我们看看代码:
IDirectorySearcher<User> userSearcher = new UserSearcher(ROOT, SCOPE);
IDirectorySource<Group> groups = new DirectorySource<Group>(userSearcher);
IDirectorySearcher userSearcher=新用户搜索器(根,范围);
IDirectorySource组=新目录源(userSearcher);
因此这里DirectorySource
的T
是Group
。现在,构造函数将要求您传入一个IDirectorySearcher
——据我所知,userSearcher
不是。所以这段代码不会编译,这正是您想要的。问题出在哪里?您是否考虑过:
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);
公共类目录源
where TValue:IDirectoryEntry
where TSearcher:idirectorysarcher,new()
{
公共目录源(Tsarcher seacher)
{
搜索者=seacher
}
公共搜索器{get;private set;}
}
IDirectorySearcher groupSearcher=新的groupSearcher(根,范围);
var groups=新目录源(groupSearcher);
您是否考虑过:
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);
公共类目录源
where TValue:IDirectoryEntry
where TSearcher:idirectorysarcher,new()
{
公共目录源(Tsarcher seacher)
{
搜索者=seacher
}
公共搜索器{get;private set;}
}
IDirectorySearcher groupSearcher=新的groupSearcher(根,范围);
var groups=新目录源(groupSearcher);
我认为获得所需内容的唯一方法(据我理解)是向IDirectorySharer
添加一个GetSource
方法,该方法返回IDirectorySource的实现。我认为获得所需内容的唯一方法(据我理解)如果您将GetSource
方法添加到idirectorysarcher
中,该方法将返回IDirectorySource
的实现,谢谢您的回答。我之所以要这样做,是因为,就目前而言,人们可以做以下几点:(请参阅我的编辑1)。如果您看到我的编辑1,您现在可能会更好地理解为什么我要对一个GroupSearcher
,强制它或约束或其他任何东西,以继续我的示例。您认为我应该做些什么?我的设计不好吗=S@Will当前位置我不清楚那将如何编译。您可能试图创建一个DirectorySource
来传递一些没有实现idirectorysarcher
的东西,所以就我所见,它不会编译。你试过了吗?我对泛型很陌生,我认为DirectorySource
中的T
和IDirectorySearcher
中的T
是完全独立的,即使T
是在源代码中指定的。为了回答你的问题,我还没有测试它,因为我在VB.NET2.0中编写了这段代码,它不允许我使用我在C#中使用过的大量功能,所以我用C#重写它,就像我会做的那样,然后在测试完成后使用从C#到VBNET的转换器。此外,通过您的编辑,我看不出有任何问题!=)谢谢,这很有帮助!=)谢谢你的回答。我之所以要这样做,是因为,就目前而言,人们可以做以下几点:(请参阅我的编辑1)。如果您看到我的编辑1,您现在可能会更好地理解为什么我要对一个GroupSearcher
,强制它或约束或其他任何东西,以继续我的示例。您认为我应该做些什么?我的设计不好吗=S@Will当前位置我不清楚那将如何编译。您可能试图创建一个DirectorySource
来传递一些没有实现idirectorysarcher
的东西,所以就我所见,它不会编译。你试过了吗?我对泛型很陌生,我认为DirectorySource
中的T
和IDirectorySearcher
中的T
是完全独立的,即使T
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);