2009-06-05 8 views

答えて

9

は、誰もがこのような何かを持っている任意の方法を知っています:ように、後で私のコードで私はそれを参照することができます

public SOMESTRUCTURE SessionKeys : string 
{ 
    value1 = "value1key", 
    value2 = "value2key", 
    name = "name" 
} 

やって来る(私はそれをコンパイルしていないので、構文がオフになることがあります。)

public static class SessionKeys 
{ 
    public const string Value1 = "Value1"; 
    public const string Value2 = "Value2"; 
    ... 
} 
+0

私は静的なクラスの使用について考えていました。とても清潔。ちょうどそこに私が気づいていなかったいくつかの他のオプションがあるかもしれないと思った。 – sarsnake

+0

+1このような静的なクラスを常に使用します。ここ – DancesWithBamboo

+2

問題は、昔ながらの文字列パラメータを使用する必要があり、関数にこれらの値のいずれかを渡すために、そのためのコースコンパイラは、その関数の_any_文字列を可能にするということです。 –

3

をC#2.0を使用して - 私はJohn Fisherにより示唆されるように最善のオプションは、あなたの値の定数と静的クラスを使用することであると信じています。

あなたがC#3.0を使用することができる場合は、標準のenum、あまり好ましくない方法で変換を処理するための単純な拡張メソッドを使用することができます。

3

はここに私の答えを参照してください:
Getting static field values of a type using reflection

このジョン・フィッシャーの答えとの違いは、関数のパラメータとしてSessionKeysを渡し、あなたが望む列挙のようなセマンティクスを得ることができるということです。

VB.Netには以前の質問がありましたが、C#ポートはそれほど難しいものではありません。実際には、ここでは(未テスト):

public interface ICustomEnum<T> 
{ 
    ICustomEnum<T> FromT(T value); 
    T Value { get; } 

    // Implement using a sealed class with a private constructor 
    // that accepts and sets the Value property, 
    // one shared readonly property for each desired value in the enum, 
    // and implicit conversions to and from T. 
    // Then see this link to get intellisense support 
    // that exactly matches a normal enum: 
    // https://stackoverflow.com/questions/102084/hidden-features-of-vb-net/102217#102217 
    // Note that the completion list only works for VB. 
} 

/// <completionlist cref="SessionKeys"/> 
public sealed SessionKeys: ICustomEnum<string> 
{ 
    private string _value; 
    public string Value { get { return _value; } } 

    private SessionKeys(string value) 
    { 
     _value = value; 
    } 

    private static SessionKeys _value1 = new MyStringEnum("value1key"); 
    public static SessionKeys value1 { get { return _value1;} } 

    private static MyStringEnum _value2 = new MyStringEnum("value2key"); 
    public static MyStringEnum value2 { get { return _value2;} } 

    public static ICustomEnum<string> FromString(string value) 
    { 
     // use reflection or a dictionary here if you have a lot of values 
     switch(value) 
     { 
      case "value1key": 
       return value1; 
      case "value2key": 
       return value2; 
      default: 
       return null; //or throw an exception 
     } 
    } 

    public ICustomEnum<string> FromT(string value) 
    { 
     return FromString(value); 
    } 

    public static implicit operator string(SessionKeys item) 
    { 
     return item.Value; 
    } 

    public static implicit operator SessionKeys(string value) 
    { 
     return FromString(value); 
    } 
} 

あなたはインターフェイスを本当に必要はありませんが、私はそれがそれらを実装する方法を私に思い出させるために保ちます。

1

実際には、列挙型は単なる静的なクラスではなく、数多くの公開数値定数を持っています。列挙型は型です。定数を使用すると、型の安全性が失われます。クラスの静的メンバをクラスと同じ型にすると、型の安全性を確保できます。

public sealed class SessionKey 
{ 
    private _value; 
    private SessionKey(string value) 
    { 
     _value = value; 
    } 

    public string Value { get return _value; } 

    public static readonly SessionKey Value1 = new SessionKey("Value1"); 
    public static readonly SessionKey Value2 = new SessionKey("Value2"); 
} 

public class Something 
{ 
    /* stuff */ 
    public void Foo(SessionKey sessionKey) 
    { 
     switch(sessionKey.Value) 
     { 
      case SessionKey.Value1.Value: 
       DoBaz(); 
       break; 
      case SessionKey.Value2.Value: 
       DoBop(); 
       break; 
      default: 
       DoBar(); 
     } 
    } 

    /* other stuff */ 
} 
関連する問題