DOBON.NET DOBON.NETプログラミング掲示板過去ログ

Classを列挙型のように扱いたい

環境/言語:[VisualStudio2010 C#]
分類:[ASP.NET]

下記のように
dt1.Value,dt1.Nameとついになる情報を持たせた上で
「GetValue(Name) 戻り値Value」のように対応する情報を返す関数も
作成したいのですが、何かよい方法はないでしょうか。

下記の形から、GetValue(name)関数のため
別にdt1,dt2用のListを作成しておく方法を考えたのですが
それだと今後Listに追加漏れする可能性があるので、
悩んでいます。

何か方向性になる情報を教えていただければと思います。

public static class testclass
{
public static Status dt1 = new Status("nameA", "0");
public static Status dt2 = new Status("nameB", "1");

public class Status
{
public string Value;
public string Name;

public Status(string value, string name)
{
Value = value;
Name = name;

return;
}
}

↓↓↓ 引数のnameにあわせvalueを返したい
public static string GetValue(string name)
{
// dt1,dt2の中から該当するnameを持つものの値を返したい
return value;
}
}
まず、Dictionary クラスは検討したという認識で相違ないでしょうか?
キーと値のペアを扱うならこのクラスでも十分だと思っていますが、それを使いたくない、あるいは使えない事情があるという前提ですよね?

List か Dictionary かのコレクションに入れておくのが一手ですが、追加漏れを完全に防ぐならリフレクションを使うしかなさそうに感じます。
フィールド変数のリフレクションについて調べてみてください。

ところで、現在の dt1, dt2 は public なので外からインスタンスを書き換えることができます。また、Status の中の Name, Value も外から書き換えることができます。
不用意な不具合を埋め込まないためにも、readonly キーワードを付与するか、get のみを持つプロパティも検討しましょう。
2012/01/07(Sat) 09:13:42 編集(投稿者)

> まず、Dictionary クラスは検討したという認識で相違ないでしょうか?
Dictionary は完全に忘れていました。
ご指摘ありがとうございます。
Dictionaryクラスで実装できる部分(実際はそれがほとんどでした)と
下記のような動きをさせたい部分がありました。
1.if (testclass.dt1.Value == 変数){}
2.testclass.GetName("value1");

> フィールド変数のリフレクションについて調べてみてください。
探していたものは、まさにこれでした。
下記のソースで一覧から情報を取得することができました。
public static string GetName(string value)
{
Type filetype = typeof(testclass);

//Staticフィールドの値を取得する
foreach (FieldInfo info in filetype.GetFields())
{
    ↓ここの条件はもう少し検討の余地ありと思ってます
if (info.IsStatic)
{
Status status = (Status)info.GetValue(null);
if (status.Value== value)
return status.Name;
}
}

return "";
}

> 不用意な不具合を埋め込まないためにも、readonly キーワードを付与するか、get のみを持つプロパティも検討しましょう。
ご指摘ありがとうございます。
readonlyにしたいと思います。


解決です、ありがとうございました。
解決済み!
■No29568に返信(OK牧場さんの記事)
> 下記のような動きをさせたい部分がありました。
> 1.if (testclass.dt1.Value == 変数){}
> 2.testclass.GetName("value1");

1 と 2 の一行ではどういったことがやりたくて、Dictionary がだめだったかが読み取れませんでした。

Key="dt1", Value="hogehoge" という形でフィールド変数 _dictionary に登録しているのであれば、_dictionary["dt1"] == 変数 と書けると思います。これが 1 に相当しますか?

"value1" に対応するキーを探したいと言うことなのかな。
Dictionary に対して foreach ループで KeyValuePair を見ていけば Key を特定できるのでは?

# LINQ 使えば一行でできるかもしれませんが、未検討。
返信ありがとうございます。

もう少しまとめて、また週末に返信したいと思います。
開発環境がないので、取り急ぎ返信まで。。
>1 と 2 の一行ではどういったことがやりたくて、Dictionary がだめだったかが読み取れませんでした。
1.については
testclass.Year.Value,testclass.Year.Name,testclass.Month.Value・・
のように、
Year,Monthなどの名称で分類できると
コーディングが楽になるのではと考えていました。
2.については
testclass内の値からDB値に対応した名称を取得して
一覧表示(詳細画面での説明項目など)で
使用するなどがイメージです。

"dt1"という名前が仮に定数だとしてもその名称(dt1)を思い出せないので、
プロパティにする方法も考えたのですが、
その場合、Key項目がdt1,dt2・・・と増えるたびにプロパティの追加が必要になり
手間かかりそうだと考えました。

ほとんどのものはDictionaryにしてるのですが、
Value値を探して取得したり、比較してチェックするものが
一部いたのでそういったものはクラスにさせていただきました。

当初の要望からうまく伝えられてなかった
またそこまで考えてなかったこともありますが、
よろしくお願いいたします。
■No29615に返信(OK牧場さんの記事)
> 1.については
> testclass.Year.Value,testclass.Year.Name,testclass.Month.Value・・
> のように、
> Year,Monthなどの名称で分類できると
> コーディングが楽になるのではと考えていました。

なるほど。
フィールドを間違って指定したときに、コンパイル時に検出できるという点を考えれば、それでよさそうですね。

# さらなるスマートな書き方がぱっとは思いつかないので対案出せず。すみません。orz

DOBON.NET | プログラミング道 | プログラミング掲示板