我有一组自定义类属性 - 每个属性的名称与数据库中的值相同。我想要做的是根据开关动态设置每个属性的值。
自定义属性如下所示:
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();
}
这可能吗?如果是,请提供示例或参考。
答案 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"]