c#泛型方法,具有多个类型的一个参数
本文关键字:一个 参数 类型 泛型方法 | 更新日期: 2023-09-27 18:14:00
我在编写通用方法来检索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
我能做到这一点还是我错过了什么?
您应该将T
限制为您的方法有意义的类型:
private static IENumerable<string> GetGroupsOrUsers<T>(T GroupOrUserPrincipal)
where T : Principal
{
// .....
这可以防止调用GetGroupsOrUsers<int>
,并让T
隐式转换为Principal
,修复您的错误(或我希望如此)。
可能您希望查看泛型约束,特别是派生约束,其中您的各种T对象都实现了给定的接口。如
where T : Principle
您需要指定类型参数约束;例如:
private static IEnumerable<string> GetGroupsOrUsers<T>(T GroupOrUserPrincipal) where T: Principal
这限制了可以用作T的类只能是Principal
类型的类或Principal
的子类。这样c#编译器就知道传递给GetGroupsOrUsers(...)
的所有内容都是与Principal
兼容的类型,并且不再出错。
你必须在这一行写一个强制转换:
ps.QueryFilter = (Principal) GroupOrUserPrincipal;