web-dev-qa-db-ja.com

(配列のように) `arr [key]`でインデックスを付けることができるクラスを書く方法は?

Session.Add("LoginUserId", 123);を実行してから、配列のようにSession["LoginUserId"]にアクセスできるように、どのように実装しますか?

27
Riz

インデクサー が必要です:

public Thing this[string index]
{
    get
    {
         // get the item for that index.
         return YourGetItemMethod(index)
    }
    set
    {
        // set the item for this index. value will be of type Thing.
        YourAddItemMethod(index, value)
    }
}

これにより、クラスオブジェクトを配列のように使用できるようになります。

MyClass cl = new MyClass();
cl["hello"] = anotherObject;
// etc.

さらにヘルプが必要な場合は、 チュートリアル も利用できます。

補遺

これを静的クラスで使用できるようにしたいとおっしゃいました。静的インデクサーを使用できないため、これはもう少し複雑になります。インデクサーを使用する場合は、静的フィールドまたは この回答 のような魔術からインデクサーにアクセスする必要があります。

52
Jake Basile

必要なのは 汎用辞書 だけのようです。

var session = new Dictionary<string, object>();

//set value
session.Add("key", value);

//get value
var value = session["key"] as string;

これをstaticにしたい場合は、別のクラスの静的メンバーにするだけです。

public static class SharedStorage
{
   private static Dictionary<string, object> _data = new Dictionary<string,object>();
   public static Dictionary<string, object> Data { get { return _data; } }
}

次に、初期化することなく、そのままアクセスできます。

SharedStorage.Data.Add("someKey", "someValue");
string someValue = (string) SharedStorage.Data["someKey"];

より冒険的になりたい場合で、.NET 4を使用している場合は、ASP.NET MVC 3のコントローラーで使用できるViewBagメンバーのように、 Expando Object を使用することもできます。

dynamic expando = new ExpandoObject();
expando.UserId = 5;
var userId = (int) expando.UserId;
2
Can Gencer

インデクサーを使用する必要があります。リンクを参照してください: http://msdn.Microsoft.com/en-us/library/2549tw02.aspx

2
Mohammed Asaad

通常のSession変数の使用方法では、本当に必要なのは このような一般的な辞書コレクション だけです。あなたは本当にクラスを書く必要はありません。ただし、機能やセマンティクスを追加する必要がある場合は、コレクションをクラスでラップし、インデクサーとインデクサーを含めることができます。

他のコレクションについては、 Collections.Generic 名前空間を確認してください。

0
Paul Sasik