如何仅在运行时知道列的名称,将动态添加到动态对象

时间:2017-04-18 18:41:04

标签: c# dynamic

This article显示了如何向动态对象添加属性。

dynamic contact = new ExpandoObject();
contact.Name = “Patrick Hines”;
contact.Phone = “206-555-0144”;

如果我改为列["Id", "Name", "Phone"]列。

,该怎么办?
DataTable dt = ContactRepository.GetContactInfo(sqlText, columns);

当我得到结果时,我想做类似

的事情
foreach(DataRow row in dt.Rows)
{
   dynamic contact = new ExpandoObject();

   foreach(string colName in columns)
   {
      // extract the value of the column from the row
      // add an property that has the same name has the column name
   }
}

我试图避免在添加之前检查每个可能的列。

至少有36列。

if(columns.Contains("Phone"))
   contact.Phone = row["Phone"].ToString();

我真的想要实现的最后一个功能是为了避免所有这些检查。

感谢您的帮助

1 个答案:

答案 0 :(得分:4)

所以,我不知道如何使用DataRow课程,但在这种情况下我知道如何使用Expando

foreach(DataRow row in dt.Rows)
{
    IDictionary<string,object> contact = new ExpandoObject();
    foreach(string colName in columns)
    {
        contact.Add(colName,row[colName]);
    }
    dynamic contactDynamic = contact as ExpandoObject;
    Console.WriteLine(contact.Phone);
}

小心! ExpandoObject实现IDictionary界面,而不是Dictionary类。