【问题标题】:C# generic method with one parameter of multiple types具有多个类型的一个参数的 C# 泛型方法
【发布时间】:2011-12-25 03:43:16
【问题描述】:

我在编写用于检索 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

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

【问题讨论】:

  • 快速提问。为什么不为组编写一种方法,为用户编写另一种方法?
  • 这就是我所做的,但只是想使用一种方法对其进行一些简化 - 这种方法中有更多代码,所以实际上是为了避免重复。
  • GroupPrincipal 和 UserPrincipal 是从 Principal 派生的?
  • 几个指向类型约束的好答案 - 但如果您不希望您的代码适用于任何其他主体类型,那么这些答案将会失败,例如一个 ComputerPrincipal (即您的意思是您希望它适用于您列出的两种类型,而不适用于其他类型?)
  • @J. Kommer - 我的意思是,OP 请求了一些适用于 GroupPrincipalUserPrincipal 的东西 - 我试图询问这是否是该方法应该适用的 exclusive 类型列表。 .

标签: c# generics


【解决方案1】:

你需要指定一个type parameter constraint;例如:

private static IEnumerable<string> GetGroupsOrUsers<T>(T GroupOrUserPrincipal) where T: Principal

这将可以用作 T 的类仅限于 Principal 类型的类或 Principal 的子类。然后,C# 编译器知道传递给GetGroupsOrUsers(...) 的所有内容都将属于与Principal 兼容的类型,并且不再出错。

【讨论】:

    【解决方案2】:

    您可能想查看Generic Contraints,特别是一个派生约束,其中您的各种 T 对象都隐含了一个给定的接口。比如

    where T : Principle
    

    【讨论】:

      【解决方案3】:

      您应该将T 限制为您的方法适用的类型:

      private static IENumerable<string> GetGroupsOrUsers<T>(T GroupOrUserPrincipal)
              where T : Principal
      {
            // .....
      

      这可以防止调用GetGroupsOrUsers&lt;int&gt;,并让T 隐式转换为Principal,从而修复您的错误(或者我希望如此)。

      【讨论】:

      • 非常酷。从来没有想过这样做。你知道使用这个的优缺点吗?
      • @thats_how_i_feel:您可以在msdn.microsoft.com/en-us/library/… 阅读更多相关信息。我不知道有什么缺点,优点主要是类型安全和可重用性。
      • 嗯,我喜欢。我觉得它鼓励更好的面向对象编程。如果你有三个类,它们都有一个基本相同的方法,并且你想在另一个类中使用它们相似的方法创建另一个方法,你不应该创建三个新方法,对吧?不管怎样,this section of Wikipedia's C# page 帮助我更好地理解了类型参数。
      【解决方案4】:

      你必须在这一行写一个演员表:

      ps.QueryFilter = (Principal) GroupOrUserPrincipal; 
      

      【讨论】:

        猜你喜欢
        • 2021-03-22
        • 1970-01-01
        • 1970-01-01
        • 2013-03-04
        • 2018-05-15
        • 1970-01-01
        • 1970-01-01
        • 2015-12-28
        • 1970-01-01
        相关资源
        最近更新 更多