C # перебирает членов класса, чтобы найти определенное условие - PullRequest
0 голосов
/ 19 апреля 2011

У меня есть класс 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 ]

2 голосов
/ 19 апреля 2011

Говоря в терминах рефлексии, это то, что вы можете сделать:

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

Конечно, я должен согласиться с людьми, комментирующими Это не как вы разрабатываете свои базы данных.Однако таблицы data mining могут выглядеть следующим образом (100+ столбцов, кто-нибудь?) Или, может быть, старых, устаревших системных таблиц (над которыми у нас мало контроля).Грязные уловки - не такое уж страшное решение.

1 голос
/ 19 апреля 2011

Как уже говорили другие, это проблема с тем, как устроена база данных.Лучшее решение - создать отдельную таблицу, в которой будет указана текущая ставка для каждого фонда (на @Paulo Santos).Однако, если вы застряли с этим решением (как и многие из нас), вы можете использовать отражение, но отражение довольно медленное (см. Решение @Achim).Вы также можете поместить каждую переменную в словарь и получить доступ к скорости через словарь.Таким образом, вам не нужно дублировать логику, но если вам нужно добавить поле, нужно добавить его в словарь.

Еще один способ - использовать подход DDD и изолировать DTO от объектов/ значения объектов.Сохраните эти объекты и используйте их, как если бы они были DTO, а не бизнес-объектом.Затем создайте объект Fund со свойством Rate и сопоставьте объект DTO с бизнес-объектом.В конечном счете, это станет началом перехода к лучшей структуре данных - начиная с уровня C #.

0 голосов
/ 19 апреля 2011

Да, вы должны быть в состоянии решить эту проблему с помощью 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";
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...