искать константы, основанные на значении - PullRequest
1 голос
/ 02 апреля 2010

У меня есть сторонняя структура, которая состоит из следующего:

[StructLayout(LayoutKind.Sequential, Size=1)]
public struct BigBlueReasonCodes
{
    public const int ABC_REASONCODE_DESCRIPTION001 = 1000;
    public const int ABC_REASONCODE_DESCRIPTION002 = 1005;
    public const int ABC_REASONCODE_DESCRIPTION003 = 1010;
    public const int DEF_REASONCODE_DESCRIPTION004 = 2001;
    public const int DEF_REASONCODE_DESCRIPTION005 = 2010;
    public const int DEF_REASONCODE_DESCRIPTION006 = 2013;
    public const int GHI_REASONCODE_DESCRIPTION007 = 3050;
    public const int GHI_REASONCODE_DESCRIPTION008 = 3050;
    public const int GHI_REASONCODE_DESCRIPTION009 = 3052;
    public const string JKL_REASONCODE_DESCRIPTION010 = "XYZ";
    public const string GHI_REASONCODE_DESCRIPTION011 = "ST";


  static BigblueReasonCodes();
}

Я пытаюсь найти описание причины (имя поля) на основе кода причины (значения), чтобы мой класс мог выполнить что-то вроде:

string failureReason = GetReasonDescription(reasoncode);

Следует упомянуть, что некоторые имеют значения int, а некоторые имеют строковые значения. Я беспокоюсь только о тех, кто имеет значения int. Я также хочу только те, которые начинаются с GHI_, если это возможно, но не имеет большого значения.

Ответы [ 3 ]

6 голосов
/ 02 апреля 2010

Вы можете решить это с помощью отражения, проанализировав структуру:

public string GetReasonDescription(int reasonCode)
{
    return
        typeof(BigBlueReasonCodes)
            .GetFields(BindingFlags.Public | BindingFlags.Static)
            .Where(field => field.FieldType == typeof(int)) // Filter int values
            .Where(field => field.Name.StartsWith("GHI"))
            .Where(field => (int) field.GetValue(null) == reasonCode)
            .Select(field => field.Name).First(); // Assuming a field must exists
}

Пример использования:

[Test]
public void GetReasonDescriptionTest()
{
    string reasonDescription = GetReasonDescription(3050);
    Assert.That(reasonDescription, Is.EqualTo("GHI_REASONCODE_DESCRIPTION007"));
}
4 голосов
/ 02 апреля 2010

Похоже, ваши целочисленные константы должны быть действительно перечислением (или несколькими перечислениями) - это также позволит преобразовывать целые числа в целые и обратно.

Вы можете сделать это с помощью отражения, но это будет медленнее, чем преобразование в перечисления.

1 голос
/ 02 апреля 2010

Если вы вставили целочисленные значения в enum вместо констант, вы можете сделать

public enum BigBlueReasonCode
{
    ABC_REASONCODE_DESCRIPTION01 = 1000,
    ABC_REASONCODE_DESCRIPTION01 = 1005,
    ABC_REASONCODE_DESCRIPTION01 = 1010,
    DEF_REASONCODE_DESCRIPTION01 = 2001,
    DEF_REASONCODE_DESCRIPTION01 = 2010,
    DEF_REASONCODE_DESCRIPTION01 = 2013,
    GHI_REASONCODE_DESCRIPTION01 = 3050,
    GHI_REASONCODE_DESCRIPTION01 = 3051,
    GHI_REASONCODE_DESCRIPTION01 = 3052
}

var failureCode = Enum.GetName( reasoncode )

(Конечно, этот код не будет работать как есть, потому что у вас есть дубликаты в именах, но он также не будет компилироваться как константа.)

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...