C#myclass。[(col.ColumnName)] = row [(col.ColumnName)]表示预期的标识符?

时间:2011-11-14 21:06:30

标签: c# reflection

下面的代码在“emp。(col.ColummnName)”下给出了一个红色的边框。错误是“标识符

foreach (DataColumn col in dt.Columns)
{
   emp.(col.ColumnName) = row[(col.ColumnName)];
}

emp 是一个自定义类,其属性名称与dataTable dt 中的列名相对应。

我怀疑我必须以不同方式构造表达式,以便我可以使用方法调用(col.ColumnName)的结果引用类 \ temp 的属性。

任何想法都将受到赞赏。

==========================

带有工作功能代码的最终答案;

public void rowToObject(ref DataRow dr, ref object myObj)
{
    foreach (DataColumn dc in dr.Table.Columns)
    {
        string colName = dc.ColumnName;
        object colValue = dr[colName];

        if (object.ReferenceEquals(colValue, DBNull.Value))
        {
            colValue = null;
        }

        PropertyInfo pi = myObj.GetType().GetProperty(colName);
        if (pi != null && colValue != null)
        {
            Type propType = null;
            Type nullableType = Nullable.GetUnderlyingType(pi.PropertyType);

            if (nullableType != null)
            {
                propType = nullableType;
            }
            else
            {
                propType = pi.PropertyType;
            }

            if (object.ReferenceEquals(propType, colValue.GetType()))
            {
                pi.SetValue(myObj, colValue, null);
            }
        }
    }
}

3 个答案:

答案 0 :(得分:6)

不支持此语法,必须在编译时知道属性名称。您可以改为使用反射:

foreach (DataColumn col in dt.Columns)
{
   PropertyInfo prop = emp.GetType().GetProperty(col.ColumnName);
   prop.SetValue(emp, row[col.ColumnName], null);
}

答案 1 :(得分:1)

这种类属性的动态访问非常有用,但它并不像你希望的那样容易实现。

您需要查看Reflection ...使用此库,您可以动态制作和填充您的课程,但需要一些阅读和试用/错误。

以下是一些讨论您情况的链接;但是,您可能需要先查看Reflection 101 tuturial。:

如果有帮助,请投票

答案 2 :(得分:0)

我不知道你可以按照你想要的方式去做。你正在寻找的是反思,你可以在这篇文章中找到一个如何运作的例子:

How to loop through all the properties of a class?