【问题标题】:Parsing a type class in c#在 C# 中解析类型类
【发布时间】:2010-09-22 04:48:16
【问题描述】:

我有这样的代码

public class People
{
    public string name { get; set; }
}

public class Animal
{
    public string age { get; set; }
}

class Test
{
    public void DataPeopleList()
    {
        string sql = "SELECT * FROM People"; 
        SqlCommand cmd = new SqlCommand(sql, conn); 
        SqlDataReader rdr = cmd.ExecuteReader();
        List<People> list = new List<People>();
        while (rdr.Read()) {
            People p = new People();
            p.name = rdr["name"].ToString();
            list.Add(p);
        } 
        rdr.Close();             
    }

    public void DataAnimalList()
    {
        string sql = "SELECT * FROM Animal";
        SqlCommand cmd = new SqlCommand(sql, conn);
        SqlDataReader rdr = cmd.ExecuteReader();
        List<People> list = new List<People>();
        while (rdr.Read())
        {
            People p = new People();
            p.name = rdr["age"].ToString();
            list.Add(p);
        }
        rdr.Close();
    }
}

我觉得对我不好。我可以写给类作为参数,所以当我想要加载数据时,我只需将查询和类作为参数..例如我想要的代码:

public void LoadData(string query, Type ClassName)
    {
        SqlCommand cmd = new SqlCommand(sql, conn);
        SqlDataReader rdr = cmd.ExecuteReader();
        List<ClassName> list = new List<ClassName>();
        while (rdr.Read())
        {
            ClassName p = new ClassName();
            //p.name = rdr["age"].ToString(); i dont have idea in this part
            list.Add(p);
        }
        rdr.Close();
    }

所以我足以调用类似的方法

public void DataAnimalList()
    {
        string sql = "SELECT * FROM Animal";
        LoadData(sql,class Animal);
    }

你能给我一个答案或提示吗.. 提前致谢

【问题讨论】:

  • 您是否考虑过改用 ORM?

标签: c# asp.net


【解决方案1】:

您可以通过反射完成类似的事情,但我强烈建议您改用 ADO.NET Entity FrameworkLinq to SQLNHibernate 等 ORM 框架。 p>

您可能想阅读:

【讨论】:

  • +1。既然都做了一百遍,为什么还要写这种代码,而开发人员实际上可以编写一些具有商业价值的代码?
  • 同意 - 将 10% 的时间用于学习您选择的 ORM,例如 NHibernate、EF、ActiveRecord 等,并专注于交付价值。看看ayende.com/Blog/archive/2008/11/21/…
【解决方案2】:

你可以使用泛型。我认为可以这样做:

public List<T> LoadData<T> (String query) {
    SqlCommand cmd = new SqlCommand(query, conn);
    SqlDataReader rdr = cmd.ExecuteReader();
    List<T> list = new List<T>();
    while (rdr.Read())
    {
        T p = new T(rdr[0]);
        list.Add(p);
    }
    rdr.Close();

    return list;
}

您必须为每个接受数据作为参数的类创建一个构造函数。您可以稍微修改代码并使用 DataAdapter 来填充 DataTable,然后您可以创建一个接受 DataRow 作为参数的构造函数,这样您就可以实例化具有不同数量元素的类。

但是,如果您对此感到更复杂,我建议您使用一些 ORM 框架,例如 Linq to SQL、Entity Framework、Nhibernate...

【讨论】:

    【解决方案3】:

    我觉得,您的想法可能不是那么优雅的解决方案。因为

    1) 您可以使用反射,但这会导致性能不佳。所以,最好不要去,直到它非常需要。

    2) 另外,明天,如果结果集中要处理的列发生变化,那么无论如何您都需要调整代码,否则您的代码可能会失败。

    所以,最好你可以按照 Ani 的建议去使用一些 ORM 框架。

    【讨论】:

      【解决方案4】:

      如果我的问题没有错,那么您正在寻找的是多态性。试试这个:

      void DataList(IType var)
      {
        if(IType is Animal)
        {
          //Do something for Animal
        }
      
        if(IType is People)
        {
          //Do something for People
        }
      }
      

      Animal 和 People 类都会实现 IType 接口,它可以是一个空接口。

      更好的设计是更改您的代码结构并将 DataList 方法移动到 IType 并在您的 People 和 Animal 类中相应地实现它。不止一种给猫剥皮的方法,你看 :)

      【讨论】:

      • 仍然不会有太大帮助 - 他想要作为查询结果设置的属性是子类的成员,而不是基类的成员。创建一个可重用的方法,可以根据数据集中的结果设置对象的属性,而无需知道对象的类型。
      • 如果类型是已知的(在这种情况下我们确实知道),那么我在这里看不到任何问题。
      【解决方案5】:

      您可以有这样的事情,其中​​使用委托从数据读取器填充对象:

      public List<T> LoadData<T>(string sql, Action<IDataReader, T> fill) where T : new()
      {
        using( SqlCommand cmd = new SqlCommand(sql, conn) )
        using( SqlDataReader reader = cmd.ExecuteReader() )
        {
          List<T> items = new List<T>();
          while( reader.Read() )
          {
            T item = new T();
            fill(reader, item);
            items.Add(item);
          }
          return items;
        }
      }
      

      然后像这样使用它:

      public List<Person> LoadPeople()
      {
          return LoadData<Person>("SELECT * FROM Person", (r, p) => 
          {
            p.Name = r["Name"].ToString();
          });
      }
      

      但实际上你应该使用 ORM。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2013-07-18
        • 1970-01-01
        • 2017-08-13
        • 2020-08-05
        • 2013-06-24
        • 1970-01-01
        相关资源
        最近更新 更多