如何动态分配集合中的属性

时间:2010-11-10 16:22:27

标签: c# asp.net c#-3.0

我在C#上工作。

foreach (DataGridViewRow item in dataGridView1.Rows)
{
    if (Convert.ToBoolean( item.Cells[0].Value) == true)
    {
        foreach (DataGridViewColumn col in dataGridView1.Columns)
        {
            **class oclass=new class();
            oclass.property = item.Cells[col.Name].Value.ToString();
            Collection.add(oclass);**
        }
    }

}

在上面的语法中,我希望动态填充属性。我还在集合中添加了我的类。它可以在C#中使用,动态填充类属性?我的网格包含多个列。我的网格列名与类属性名相同。我想做以下事情:

foreach (DataGridViewColumn col in dataGridView1.Columns)
{
    **class oclass=new class();
    oclass.col.Name= item.Cells[col.Name].Value.ToString();
    Collection.add(oclass);**
}

提前致谢。

2 个答案:

答案 0 :(得分:4)

您可以使用PropertyInfo.SetValue()

执行此操作

在这个例子中,我已经添加了对它的全部内容的解释。

我在本例中使用了类TestClass。首先我得到了类型。

var type = typeof(TestClass);

然后,我构建了一个包含所有列名的字典和一个PropertyInfo,它是对该类属性的引用,其名称与列相同。

var properties = new Dictionary<string, PropertyInfo>();

foreach (DataGridViewColumn col in dataGridView1.Columns)
{
    properties.Add(col.Name, type.GetProperty(col.Name));
}

然后,每行。

foreach (DataGridViewRow item in dataGridView1.Rows)
{
    if (Convert.ToBoolean( item.Cells[0].Value) == true)
    {

我创建了TestClass的新实例。

        var instance = new TestClass();

        foreach (DataGridViewColumn col in dataGridView1.Columns)
        {

我从字典中获取属性并使用方法SetValue使用列中的值设置实例的值。但是,为了能够做到这一点,我们必须首先确保类型是正确的。

            object value = Convert.ChangeType(item.Cells[col.Name].Value, properties[col.Name].PropertyType);

            properties[col.Name].SetValue(instance, value, null);
        }

最后,我将实例添加到集合中。

        Collection.Add(instance);
    }
}

答案 1 :(得分:0)

我想念您的问题,您想用第二个片段实现什么目标?是的,如果已在类中定义了该属性,则可以在运行时设置类成员(属性)的值。替代方案是从父类派生一个新类并添加缺少的成员,或者如果你想要更动态的东西,请使用.Net 4引入的动态类型。