让类识别并循环遍历其自己的属性

时间:2013-01-13 15:00:15

标签: c# sql ado.net

我不确定这个问题的标题是否对任何人都有意义。

我的代码中的每个类表示SQL Server数据库中的表,类属性是数据字段。我有几种常用于我编写的类的方法,即填充,更新,保存等。到目前为止没有新的东西。

然而,在开发周期期间甚至在我的软件实现之后,需要在一个表中添加附加字段并因此在相应类中添加附加属性是相对常见的。这是转向意味着我必须通过Populate,Update,Save方法添加新字段,例如: -

private void Save()
{
   SqlConnection linkToDB = new SqlConnection(connString);
   linkToDB.Open();
   string sqlText = "INSERT INTO table (ID, Field1, Field2) VALUES (@ID, @Field1, @Field2);";
   SqlCommand sqlCom = new SqlCommand(sqlText, linkToDB);
   sqlCom.Parameters.Add("@ID", SqlDbType.Int).Value = this._id;
   sqlCom.Parameters.Add("@Field1",SqlDbType.VarChar).Value = this._field1;
   sqlCom.Parameters.Add("@Field2", SqlDbType.VarChar).Value = this._field2;
   sqlCom.ExecuteNonQuery();
   linkToDB.Close();
   linkToDB.Dispose();
}

图像需要在我的类中添加一个新字段,因此上面的SAVE方法需要修改sqlText,sqlCom要添加一个新参数。需要对我的UPDATE和POPULATE方法以及具有与Class属性相对应的完整参数集的任何其他方法进行相同的更改。

所以我的问题是这个。 。

是否有办法让类识别并遍历其自己的属性,并为每个属性创建正确类型的参数。我确实启动了一些代码(我知道它不能编译)但是我被卡住了。这是我到达的地方。

private void Populate()
{
   SQLExpress exp = new SQLExpress();
   using (SqlConnection linkToDB = exp.DatabaseConnection)
   {
      string sqlText = "SELECT * FROM " + this._table + " WHERE ID = @ID;";
      SqlCommand sqlCom = new SqlCommand(sqlText, linkToDB);
      linkToDB.Open();
      using (SqlDataReader reader = sqlCom.ExecuteReader())
      {
         while (reader.Read())
         {
             Type type = this.GetType();
             foreach (PropertyInfo propertyInfo in type.GetProperties())
             {
                 string propName = propertyInfo.Name;
                 Type propType = propertyInfo.GetType();

                 //this.propName = (propType)reader[propName];
                 //Type propType = propertyInfo.GetType();                            
             }
         }
      }
   }
} 

有人能提供任何建议,我可以在这里实现我的编码目标吗?我是否应该采取完全不同的方式?或者我想要达到的目标是不可能的?

2 个答案:

答案 0 :(得分:1)

你是正确的方式。获得PropertyInfo []后,您可以读取(或写入)该属性的值:

foreach (PropertyInfo propertyInfo in type.GetProperties())
{
  var propertyValue = propertyInfo.GetValue(this);
  propertyInfo.SetValue(this, new_value);
}

就是这样。 BTW和其他人一样说,你试图做的并不像看起来那么容易,并且有很多工具已经做过这种想法:它们是ORM。 看看EntityFramework或NHibernate。

答案 1 :(得分:0)

对于这些类型的1对1 CRUD操作,我更喜欢使用ORM。它处理所有映射,甚至可以在自动向数据库添加新字段时更新模型(类)。

您是否已将此作为选项进行探讨,或许Entity Framework?有很多不同的ORM - 只需快速搜索。

祝你好运。