列表中包含属性Info的List Datatable Extension

时间:2012-12-28 08:58:12

标签: c# generics

我使用Datatable Extensions从Datatable转换为List。 在这里,当我试图向正常的List属性添加一行时,它的工作正常。 但是当我在列表中使用列表时,我面临着问题。我无法在属性中设置值。

 private static T CreateItemFromRow<T>(DataRow row, IList<PropertyInfo> properties) where T : new()
    {
        T item = new T();
        foreach (var property in properties)
        {

            if (property.Name.Equals("ProductSpec"))
            {
                Type t = property.GetType();
                //  i am getting error when i am trying to do this

                property.SetValue(item, ProductSpecIteration(property, row), null);
            }

            if (row.Table.Columns.Contains(property.Name))
            {                   
                property.SetValue(item, row[property.Name] == DBNull.Value?"":row[property.Name], null);
            }

        }
        return item;
    }


 private static ProductSpec ProductSpecIteration(PropertyInfo property, DataRow row)
    {            
        ProductSpec lstProductSpec = new ProductSpec();
        lstProductSpec.product_specs_id = Convert.ToInt64(row["product_specs_id"]);            
        return lstProductSpec;
    }

我无法一般地做到这一点。但即使我无法在此扩展中添加此内容?任何人都可以帮助我摆脱这种情况

2 个答案:

答案 0 :(得分:1)

您试图转换从DataRow.Item [string]属性返回的对象,该属性无法直接设置。

string value = row[property.Name] == DBNull.Value?"":row[property.Name].ToString();
property.SetValue(item, Convert.ChangeType(value, property.PropertyType), null);

您可以使用的产品规格,

  ProductSpec spec = ProductSpecIteration(property, row);
  property.SetValue(item, Convert.ChangeType(spec , property.PropertyType), null);

但是,它可以在不更改类型的情况下正常工作,因为类型与属性类型相同

希望这会有所帮助。 您可以阅读更多相关信息here 您还可以阅读有关 IConvertible 界面here

的更多信息

IConvertible 接口有助于返回所需的值,因为对象不实现IConvertible,因此无法获取所需格式的属性类型的值。

答案 1 :(得分:0)

我不知道你到底想要什么,但这个链接可能对你有帮助

Link 1