c#泛型方法,具有多个类型的一个参数

本文关键字:一个 参数 类型 泛型方法 | 更新日期: 2023-09-27 18:14:00

我在编写通用方法来检索AD组或用户时遇到了一个问题,该方法的参数可以是两种类型之一- System.DirectoryServices.AccountManagement GroupPrincipalUserPrincipal

方法如下:-

private static IEnumerable<string> GetGroupsOrUsers<T>(T GroupOrUserPrincipal)
{
   PrincipalSearcher ps = new PrincipalSearcher();
   ps.QueryFilter = GroupOrUserPrincipal;
   etc.........
}

问题是GroupOrUserPrincipal显示以下错误:-

不能隐式地将类型'T'转换为System.DirectoryServices.AccountManagement.Principal

我能做到这一点还是我错过了什么?

c#泛型方法,具有多个类型的一个参数

您应该将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;