C#遍历类成员以查找特定条件

时间:2011-04-19 18:13:37

标签: c# reflection

我有一个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";
    }
} 

3 个答案:

答案 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";