【问题标题】:C# Generics on Auto-Implemented Property Classes自动实现的属性类上的 C# 泛型
【发布时间】:2014-03-16 07:32:24
【问题描述】:

我创建了一个属性类来表示我的 SQLite 数据库的表模式。类中的每个属性都成为数据库中的一个属性。

class SQLiteTables
{
    public class tblPerson
    {
        [PrimaryKey, AutoIncrement]
        public int PersonID { get; set; }
        public string PersonFirstName { get; set; }
        public string PersonMiddleName { get; set; }
        public string PersonLastName { get; set; }
    }

    public class tblSchedule
    {
        [PrimaryKey, AutoIncrement]
        public int ScheduleID { get; set; }
        public string ScheduleDescription { get; set; }
        public DateTime ScheduleStart { get; set; }
        public DateTime ScheduleEnd { get; set; }
    }

    //18 more table definitions below
}

现在,要从表中检索一些数据,

public void GetPersonList()
{
    List<tblPerson> lstTemp = dbConn.Table<tblPerson>().ToList<tblPerson>();

    // Some 20 lines of code here
}

我想避免编写特定于类型的方法,这是一项乏味的任务。我想创建一个可重用的方法,它可以使用泛型实现检索任何表上的数据。我怎样才能做到这一点?

编辑我正在使用 Windows Phone 8 平台。

【问题讨论】:

  • 一种方法是使用 ORM,例如实体框架。

标签: c# sqlite generics windows-phone-8 type-constraints


【解决方案1】:

这应该适用于您正在做的事情。

public List<T> GetItems<T>()
{
    return dbConn.Table<T>().ToList<T>();
}

【讨论】:

  • 问题是如何编写Table&lt;T&gt;() 方法来创建任何T 的实例。
  • 我认为我们对请求的解释不同。我会坚持我的回答。
【解决方案2】:

您可以使用支持 SQLite 的 DBLinq - 然后您可以在数据上下文中免费获得语法。

 public IList<T> GetList<T>()
 {
     return _context.GetTable<T>().ToList();
 }

【讨论】:

    【解决方案3】:
    public IEnumerable<T> GetItems<T>() where T: new()
        {
            lock (locker) {
                return dbCon.Table<T> ().ToArray ();
            }
        }
    

    我认为关键是最后的“:new()”

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2020-08-06
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多