有沒有從給定值確定常量名稱的方法?根據值確定常量的名稱
例如,給定下列:
公共常量UINT ERR_OK = 00000000;
如何獲得「ERR_OK」?
我一直在尋找反光,但似乎無法找到任何可以幫助我。
有沒有從給定值確定常量名稱的方法?根據值確定常量的名稱
例如,給定下列:
公共常量UINT ERR_OK = 00000000;
如何獲得「ERR_OK」?
我一直在尋找反光,但似乎無法找到任何可以幫助我。
一般來說,你不能。可以有任意數量的具有相同值的常量。如果您知道聲明常量的類,則可以查找所有公共靜態字段,並查看是否有值爲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
}
您將無法做到這一點,因爲常量在編譯時被其文字值替換。
換句話說,編譯器會這樣:
class Foo
{
uint someField = ERR_OK;
}
,並把它變成這樣:
class Foo
{
uint someField = 0;
}
我不認爲你可以做,以確定的方式。如果有多個具有相同值的常量呢?
您可能有興趣使用枚舉來代替,它可以以編程方式從名稱轉換爲值,反之亦然。
我建議你用一個枚舉來表示你的常量。
或者
string ReturnConstant(uint val)
{
if(val == 0x00000000)
return "ERR_OK";
else
return null;
}
最簡單的方法是將切換到使用枚舉
我可能會遲到..但我認爲以下可能是答案
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)
感謝喬恩,這是完全沿着我在想的方向......(僅供參考,在執行平等檢查的行上有一個缺失的右括號)。在測試時,我得到: Member'object.Equals(object,object )'不能用實例引用訪問;用類型名稱來代替「這是一個錯誤?它似乎在這樣的表面上應該工作.. – Fraser 2009-06-30 15:51:35
啊是的...我錯過了一個演員和一個字段類型檢查。修復... – 2009-06-30 16:17:45