2009-06-30 86 views
4

有沒有從給定值確定常量名稱的方法?根據值確定常量的名稱

例如,給定下列:

公共常量UINT ERR_OK = 00000000;

如何獲得「ERR_OK」?

我一直在尋找反光,但似乎無法找到任何可以幫助我。

回答

14

一般來說,你不能。可以有任意數量的具有相同值的常量。如果您知道聲明常量的類,則可以查找所有公共靜態字段,並查看是否有值爲0的值,但僅此而已。那麼,這對你來說可能夠好了 - 是嗎?如果是這樣的話......

public string FindConstantName<T>(Type containingType, T value) 
{ 
    EqualityComparer<T> comparer = EqualityComparer<T>.Default; 

    foreach (FieldInfo field in containingType.GetFields 
      (BindingFlags.Static | BindingFlags.Public)) 
    { 
     if (field.FieldType == typeof(T) && 
      comparer.Equals(value, (T) field.GetValue(null))) 
     { 
      return field.Name; // There could be others, of course... 
     } 
    } 
    return null; // Or throw an exception 
} 
+0

感謝喬恩,這是完全沿着我在想的方向......(僅供參考,在執行平等檢查的行上有一個缺失的右括號)。在測試時,我得到: Member'object.Equals(object,object )'不能用實例引用訪問;用類型名稱來代替「這是一個錯誤?它似乎在這樣的表面上應該工作.. – Fraser 2009-06-30 15:51:35

+0

啊是的...我錯過了一個演員和一個字段類型檢查。修復... – 2009-06-30 16:17:45

2

您將無法做到這一點,因爲常量在編譯時被其文字值替換。

換句話說,編譯器會這樣:

class Foo 
{ 
    uint someField = ERR_OK; 
} 

,並把它變成這樣:

class Foo 
{ 
    uint someField = 0; 
} 
0

我不認爲你可以做,以確定的方式。如果有多個具有相同值的常量呢?

3

您可能有興趣使用枚舉來代替,它可以以編程方式從名稱轉換爲值,反之亦然。

1

我建議你用一個枚舉來表示你的常量。

或者

string ReturnConstant(uint val) 
{ 
    if(val == 0x00000000) 
     return "ERR_OK"; 
    else 
     return null; 
} 
1

最簡單的方法是將切換到使用枚舉

2

我可能會遲到..但我認爲以下可能是答案

public static class Names 
    { 
     public const string name1 = "Name 01"; 
     public const string name2 = "Name 02"; 

     public static string GetNames(string code) 
     { 
      foreach (var field in typeof(Names).GetFields()) 
      { 
       if ((string)field.GetValue(null) == code) 
        return field.Name.ToString(); 
      } 
      return ""; 
     } 
    } 

及以下將打印「name1

string result = Names.GetNames("Name 01"); 
Console.WriteLine(result)