2013-11-12 3 views
0

У меня есть класс, который определяет константы для моего дизайна. Например следующее:Быстрый поиск членов класса (const ints, const string и т. Д.)

public static class ObjectTypes 
{ 
    /// <summary> 
    /// The identifier for the ConfigurableObjectType ObjectType. 
    /// </summary> 
    public const uint ConfigurableObjectType = 2; 

    /// <summary> 
    /// The identifier for the FunctionalGroupType ObjectType. 
    /// </summary> 
    public const uint FunctionalGroupType = 4; 

    /// <summary> 
    /// The identifier for the ProtocolType ObjectType. 
    /// </summary> 
    public const uint ProtocolType = 5; 
} 

Сейчас в моем коде я вычислил и целое значение for.eg valueInt, и я хотел бы сравнить valueInt со всеми констант, определенных в этом классе. Есть ли быстрый способ сделать это, не используя блоки If-then-else или switch, потому что, если существует большое количество констант, такой подход приведет к большому коду. Является ли лучший подход каким-то образом возможным? Я работаю на C#.

Примечание: Я не могу изменить дизайн для вышеупомянутого класса, поскольку я получаю такой класс, предопределенный, например, из библиотеки или класса, разработанного кем-то другим, который я не могу изменить, но я должен ссылаться только на свой код.

+0

Удаление '[C++]' и '[Java]', поскольку они не связаны друг с другом. Я не вижу, как это объектно ориентировано. –

+1

Возможно, вам следует использовать 'enum's, где у вас может быть, например. '(ObjectTypes) 5' совпадает с' ObjectTypes.ProtocolType'. А для строк «Enum.Parse»? –

+0

@PeterLawrey Я предположил, что это общий вопрос, я сейчас работаю с C#, однако мне хотелось бы знать подход для Java или C++, так как это делает интересный вопрос для меня в отношении Java и C++, и извините, но не могли бы вы объяснить, почему вы не чувствуете, что это связано с объектной ориентацией? – Ricky

ответ

1

Может использовать отражение. Если вам нужно проверить, чтобы он не выполнял неприемлемо для вас.

private static bool IsDefined(uint i) { 
     var constants = typeof(ObjectTypes).GetFields().Where(f => f.IsLiteral).ToArray(); 

     foreach(var constant in constants) { 
      if(i == (uint)constant.GetRawConstantValue()) { 
       return true; 
      } 
     } 

     return false; 
    } 
+0

Спасибо за ваш ответ, мне нужно что-то подобное. – Ricky

+0

Спасибо. Сегодня я узнал что-то новое благодаря вам и Марвину, который также предоставил аналогичный ответ. Он работал как шарм, благодаря кучу! – Ricky

+0

Добро пожаловать! Счастливое кодирование. – trope

0

Хотя это не очень красивая конструкция, чтобы дать возможное решение для данной проблемы без изменения существующего кода.

Следующий код использует отражение для сравнения

 string fieldName = "not found"; 
     uint testValue = 5; 

     Type t = typeof(ObjectTypes); 
     FieldInfo[] f = t.GetFields(); 
     Array.ForEach<FieldInfo>(f, (info) => { if (testValue == (uint)info.GetValue(null)) fieldName = info.Name; }); 

и урожайности «ProtocolType» в конце кода.

Надеюсь, что это поможет,

+0

Спасибо за ваш ответ, это выглядит интересно, я бы определенно попробовал это и опубликовал здесь в ближайшее время! – Ricky