我有一个C#类,它加载了一个数据库行(orm)..这个对象包含了所有数据..我需要一种遍历类级别成员来查找特定条件的方法吗?以下是我所拥有的权宜之计,应该有更好的解决方案.. 反思的答案是什么?谢谢!
public string findCURRRATEValue()
{
if (!FUNDNO1.Equals("999") &&
FUNDTYPE1.Equals("F"))
{
return "CURRRATE1" + "#" + CURRRATE1;
}
else if (!FUNDNO2.Equals("999") &&
FUNDTYPE2.Equals("F"))
{
return "CURRRATE2" + "#" + CURRRATE2;
}
------------
-------------
else if (!FUNDNO59.Equals("999") &&
FUNDTYPE59.Equals("F"))
{
return "CURRRATE59" + "#" + CURRRATE59;
}
else if (!FUNDNO60.Equals("999") &&
FUNDTYPE60.Equals("F"))
{
return "CURRRATE60" + "#" + CURRRATE60;
}
else
{
return "CURRRATEX";
}
}
答案 0 :(得分:2)
在反映术语中,您可以这样做:
var type = this.GetType();
var fundNoProperties = type.GetProperties()
.Where(p => p.Name.StartsWith("FUNDNO"));
foreach (var info in fundNoProperties)
{
string orderNumber = info.Name.Replace("FUNDNO", "");
var fundTypeInfo = type.GetProperty("FUNDTYPE" + orderNumber);
if (info.GetValue(this, null).ToString() == "999" &&
fundTypeInfo.GetValue(this, null).ToString() == "F")
{
var currRate = type.GetProperty("CURRATE" + orderNumber);
return currRate.Name + currRate.GetValue(this, null).ToString();
}
}
当然,我必须同意评论这不是您如何设计数据库的人。但是,数据挖掘表可能看起来像这样(100多列,任何人?)或者可能旧的遗留系统表(我们几乎无法控制)。肮脏的伎俩并不是那么可怕的解决方案。
答案 1 :(得分:1)
正如其他人所说,数据库的设计方式存在问题。最好的解决方案是创建一个单独的表格,其中包含每个基金的当前汇率(根据@Paulo Santos)。但是,如果您坚持使用此解决方案(就像我们中的许多人一样),您可以使用反射,但反射速度相当慢(请参阅@Achim的解决方案)。您还可以将每个变量放入一个字典中,并通过字典访问该速率。这样您就不必复制逻辑,但是如果您需要添加字段,则需要将其添加到字典中。
另一种方法是采用DDD方法并将DTO与实体/值对象隔离开来。保留这些对象并将它们用作DTO而不是业务对象。然后使用Rate属性创建Fund对象,并将DTO对象映射到业务对象。最终,这将是转换到更好的数据结构的开始 - 从C#级别开始。
答案 2 :(得分:0)
是的,您应该可以通过Reflection解决这个问题。伪代码出了我的脑袋应该显示出来的想法,但可能不会开箱即用:
foreach (PropertyInfo prop in this.GetType().GetProperties())
{
object val = prop.GetValue(this,new object[0]);
if (...your condition ...) return "xyz" + value;
}
return "last else case";