代码之家  ›  专栏  ›  技术社区  ›  X Pahadi

c#get这个类用于泛型

c#
  •  4
  • X Pahadi  · 技术社区  · 10 年前

    我有一个 DbContext 其他类扩展的类。例如:

    class Contact extends DbContext {}
    

    在…内 数据库上下文 类,我想使用泛型中扩展DbContext的任何类:

      public static IEnumerable<DBContext> GetAll( )
      {
          var sql = "SELECT * FROM " + TableName();
          return DB().Fetch<DBContext> (sql);
      }
    

    注释IEnumerable<数据库上下文>在这里

    上面的代码很好,但我每次都必须输入cast。我能做点什么吗 thisClass 例如:

    public static IEnumerable<thisClass> GetAll( )
    {
       var sql = "SELECT * FROM " + TableName();
       return DB().Fetch<thisClass> (sql);
    }
    

    注释IEnumerable<这个类>在这里

    在DStanley的评论之后:

    我试图做到:

        public static IEnumerable<T> GetAll<T>()
        {
            var sql = "SELECT * FROM " + TableName();
    
            return DB().Fetch<T> (sql);
        }
    

    但我不想这样称呼:

    Contact.GetAll<Contact>();
    

    不干净。正当

    注意:TableName()在这里不用担心。它根据调用的类来获取SQL方法。

    3 回复  |  直到 10 年前
        1
  •  4
  •   Kevin Gosse    10 年前

    您可以通过放置递归通用约束来实现。

    首先,您需要一个通用 DbContext<T> (要么更改您的 DbContext 通用,或添加继承层)。在内部,定义您的方法:

    public class DbContext<T> : DbContext
    {
        public static IEnumerable<T> GetAll()
        {
            var sql = "SELECT * FROM " + TableName();
    
            return DB().Fetch<T> (sql);
        }
    }
    

    那就让你的孩子 数据库上下文 从泛型类继承:

    public class Contact : DbContext<Contact>
    {
    
    }
    

    现在你可以写了 Contact.GetAll(); .

        2
  •  1
  •   Michael Blackburn    10 年前

    如果将此调用的结果赋给类型为的变量 IEnumerable<Contact> 它应该调用正确的方法。

    IEnumerable<Contact> contacts = Contact.GetAll()
    

    应该有效。

        3
  •  0
  •   Jeremy Kato    10 年前

    可以将类参数命名为泛型类型 T 然后说出需要实现的接口:

      public static IEnumerable<T> GetAll( ) where T : DBContext
      {
        var sql = "SELECT * FROM " + TableName();
        return DB().Fetch<DBContext> (sql);
      }
    

    通过这种方法,您可以将任何类传递给您的方法,只要它实现您的 DBContext 界面

    你可以阅读更多 here 在MSDN上。

    编辑:没看到D·斯坦利在评论中说了什么——这也是他的解决方案,让他先回答。