1

我有一组自定义类属性 - 每个属性的名称都与数据库中的值相同。我想做的是根据开关动态设置每个属性的值。

自定义属性如下所示:

    class MyDEF
{

    #region Variable Declaration Section....

    private string _ABC01;
    private string _ABC02;
    private string _ABC03;
    private string _ABC04;

     #endregion 

    #region Property Declaration Section

    public string ABC01
    {
        get { return _ABC01; }
        set { _ABC01= value; }
    }

    public string ABC02
    {
        get { return _ABC02; }
        set { _ABC02= value; }
    }

    public string ABC03
    {
        get { return _ABC03; }
        set { _ABC03= value; }
    }

    public string ABC04
    {
        get { return _ABC04; }
        set { _ABC04= value; }
    }

   #endregion
 }

然后值中加载的代码如下所示:

    foreach (DataRow dr in dataTable.Rows)
            {
                ED = dr["FieldDesc"].ToString();

     switch (ED)
     {
                            case "ABC01":
                                ratesVO.ABC01 = dr["DefaultValue"].ToString();
                                break;
                            case "ABC02":
                                ratesVO.ABC02 = dr["DefaultValue"].ToString();
                                break;
                            case "ABC03":
                                ratesVO.ABC03 = dr["DefaultValue"].ToString();
                                break;
                            case "ABC04":
                                ratesVO.ABC04 = dr["DefaultValue"].ToString();
                                break;
     }
    }

我想要实现的是:

    foreach (DataRow dr in dataTable.Rows)
    {
                ED = dr["FieldDesc"].ToString();
                MyCustomProperty.ED = dr["DefaultValue"].ToString();
    }

这可能吗?如果是这样,请提供示例或参考。

4

3 回答 3

1

您所说的基本上是反射,其中(简化):

string propertyName = (string)dr["FieldDesc"];
object value = dr["DefaultValue"];
// assign
obj.GetType().GetProperty(propertyName).SetValue(obj, value, null);

但是,反射会影响性能;少量使用是可以的,但是作为数据访问循环的一部分,这真的会伤害到你;您可能会考虑使用诸如FastMember之类的库支持来显着提高性能:

var wrapped = ObjectWrapper.Create(obj);
...
wrapped[propertyName] = value;

但是,我会说,将事物加载到 aDataTable中只是为了将它们推入对象模型几乎没有价值。您也可以直接从数据读取器 API 工作。

于 2012-10-10T06:03:13.747 回答
1

您可以使用反射根据属性名称动态设置值:

foreach (DataRow dr in dataTable.Rows)
{
    ED = dr["FieldDesc"].ToString();
    ratesVO.GetType().GetProperty(ED)
                     .SetValue(ratesVO, dr["DefaultValue"].ToString());
}
于 2012-10-10T06:00:26.573 回答
0

您可以做的是,像这样对数据表执行选择。(虽然这不是一个完美的代码,您可能需要对其进行改进。)

DataRow[] result = table.Select("FieldDesc='<Required property>'");
        return result[0]["DefaultValue"]
于 2012-10-10T06:02:35.203 回答