我在编写通用方法以检索AD组或用户时遇到问题,参数可以是两种类型之一 - System.DirectoryServices.AccountManagement GroupPrincipal
或UserPrincipal
方法如下: -
private static IEnumerable<string> GetGroupsOrUsers<T>(T GroupOrUserPrincipal)
{
PrincipalSearcher ps = new PrincipalSearcher();
ps.QueryFilter = GroupOrUserPrincipal;
etc.........
}
问题是GroupOrUserPrincipal显示以下错误: -
无法隐式转换类型'T' System.DirectoryServices.AccountManagement.Principal
我能做到这一点还是我错过了什么?
答案 0 :(得分:7)
您应该将T
限制为您的方法有意义的类型:
private static IENumerable<string> GetGroupsOrUsers<T>(T GroupOrUserPrincipal)
where T : Principal
{
// .....
这会阻止调用GetGroupsOrUsers<int>
,并让T
隐式转换为Principal
,从而修复错误(或者我希望如此)。
答案 1 :(得分:2)
您需要指定type parameter constraint;例如:
private static IEnumerable<string> GetGroupsOrUsers<T>(T GroupOrUserPrincipal) where T: Principal
这将可以用作T的类仅限制为类型为Principal
的类或Principal
的子类。然后,C#编译器知道传递给GetGroupsOrUsers(...)
的所有内容都是与Principal
兼容的类型,并且不会再出错。
答案 2 :(得分:2)
可能你想看Generic Contraints特别是一个派生约束,你的各种T物体都会在一个给定的界面上掠过。例如
where T : Principle
答案 3 :(得分:0)
你必须在这一行写一个演员:
ps.QueryFilter = (Principal) GroupOrUserPrincipal;