自定义类属性 - 动态参考

时间:2012-10-10 05:55:54

标签: c#

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

自定义属性如下所示:

    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();
    }

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

3 个答案:

答案 0 :(得分:1)

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

foreach (DataRow dr in dataTable.Rows)
{
    ED = dr["FieldDesc"].ToString();
    ratesVO.GetType().GetProperty(ED)
                     .SetValue(ratesVO, dr["DefaultValue"].ToString());
}

答案 1 :(得分: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;
但是,我会说,将DataTable中的内容加载到对象模型中几乎没有价值。您也可以直接使用数据读取器API。

答案 2 :(得分:0)

您可以做的是,像这样在数据表上执行选择。 (但这不是一个完美的代码,你可能需要改进它。)

DataRow[] result = table.Select("FieldDesc='<Required property>'");
        return result[0]["DefaultValue"]