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

时间:2011-11-09 09:24:45

标签: c# generics

我在编写通用方法以检索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

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

4 个答案:

答案 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;