2009-06-30 24 views
4

与えられた値から定数の名前を判別する方法はありますか?例えば値に基づいて定数の名前を決定する

、次のように与えられる:

公共のconst UINT ERR_OK = 0x00000000の。

"ERR_OK"はどのように取得できますか?

私は反省を見てきましたが、私を助けるものは何も見当たりません。

答えて

14

一般に、あなたはできません。同じ値を持つ任意の数の定数が存在する可能性があります。定数を宣言したクラスが分かっていれば、すべてのpublic staticフィールドを検索し、0の値があるかどうかを調べることができますが、それだけです。もう一度、それはあなたのために十分に良いかもしれません - それは?そうであれば...

+0

ありがとうジョン、これは私が思っていたラインに沿っています...(平等チェックを行う行には閉じ括弧がありません)このテストでは、 メンバー 'object.Equals ) 'はインスタンス参照ではアクセスできません。代わりにタイプ名で修飾する 'これはバグですか?これがうまくいくような表面上にあるようです。 – Fraser

+0

ああ、はい...私はフィールドタイプのキャストと小切手がありませんでした。修理... –

+0

パーフェクト、それはまさに私が必要としたものです。列挙型を持つ何千もの定数を持つ*巨大な*ハードウェアSDKをラップする必要がありませんでした。バウンスとして、私はクラス内で定数が一意であることを知っています。本当にありがとう、本当にありがとう。 – Fraser

2

定数はコンパイル時にリテラル値に置き換えられるため、これを行うことはできません。

言い換えれば、コンパイラは、この取ります

class Foo 
{ 
    uint someField = ERR_OK; 
} 

をし、これに変換します:私はあなたが決定論的な方法でそれを行うことができるとは思わない

class Foo 
{ 
    uint someField = 0; 
} 
0

。同じ値の定数が複数ある場合はどうなりますか?

3

Enumsの代わりに、名前から値にプログラムで変換することができます。その逆も可能です。

+0

私はサードパーティ製のApiで作業しており、コードをEnumarationに変換することを検討しています。 – Fraser

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"

関連する問題