2009-09-24 7 views
7

ASP.Netセッションと同様の方法で動作するオブジェクトを作成したいと思います。 インデクサのカスタム使用

は、それが存在しないか、それがない場合はそれを更新doesntの場合には、データベーステーブルに追加するか、あなたが

mySession["Username"] = "Gav" 

を行うとき、私はそれをしたい、私はこのオブジェクトmySessionを呼び出すと言います。これを行うメソッドを書くことはできますが、インデクサー構文([])で使用するとどのように起動するのかわかりません。私はインデクサでこのようなことをするオブジェクトを構築したことはありません。

誰かが言う前に、私はASP.Netセッションがデータベースに保存できることを知っていますが、この場合、私はややシンプルなカスタマイズソリューションが必要です。

このようにインデクサーを使用する場合のポインターや例は素晴らしいでしょう。 MSDN documentationから

おかげ

+0

可能な複製演算子C#?](https://stackoverflow.com/questions/287928/how-do-i-overload-the-square-bracket-operator-in-c) – ardila

答えて

20

それは実際にはかなり多くの一般的なプロパティを書くのと同じです:

public class MySessionThing 
{ 
    public object this[string key] 
    { 
     //called when we ask for something = mySession["value"] 
     get 
     { 
      return MyGetData(key); 
     } 
     //called when we assign mySession["value"] = something 
     set 
     { 
      MySetData(key, value); 
     } 
    } 

    private object MyGetData(string key) 
    { 
     //lookup and return object 
    } 

    private void MySetData(string key, object value) 
    { 
     //store the key/object pair to your repository 
    } 
} 

唯一の違いは、我々がキーワードを使用している "この"適切な名前を与える代わりに:

public   object   MyProperty 
^access   ^(return) type ^name 
modifier 

public   object   this 
^ditto   ^ditto   ^"name" 
+0

それは私が何をしているかのようにそれは素晴らしいように見えます。しかし、クラスのインスタンスを宣言することなくこれを使用することは可能ですか?私は静的にしようとしましたが、うまくいかないようです。 – Gavin

+1

インスタンスを宣言することなくこれを行うことはできません。 http://stackoverflow.com/questions/154489/are-static-indexers-not-supported-in-cを参照してください。 – Yuliy

6

class SampleCollection<T> 
{ 
    // Declare an array to store the data elements. 
    private T[] arr = new T[100]; 

    // Define the indexer, which will allow client code 
    // to use [] notation on the class instance itself. 
    // (See line 2 of code in Main below.)   
    public T this[int i] 
    { 
     get 
     { 
      // This indexer is very simple, and just returns or sets 
      // the corresponding element from the internal array. 
      return arr[i]; 
     } 
     set 
     { 
      arr[i] = value; 
     } 
    } 
} 

// This class shows how client code uses the indexer. 
class Program 
{ 
    static void Main(string[] args) 
    { 
     // Declare an instance of the SampleCollection type. 
     SampleCollection<string> stringCollection = new SampleCollection<string>(); 

     // Use [] notation on the type. 
     stringCollection[0] = "Hello, World"; 
     System.Console.WriteLine(stringCollection[0]); 
    } 
} 
4

C#のインデクサーは、名前がthisのプロパティです。あなたはSessionStateStoreProviderBaseクラスとIRequiresSessionStateインタフェースを実装するために見て、ASP.NETセッション状態を制御するために、あなたのクラスを使用したいとしている場合はここで...

public class Session { 
    //... 
    public string this[string key] 
    { 
     get { /* get it from the database */ } 
     set { /* store it in the database */ } 
    } 
} 
0

例です。次に、あなたのセッションプロバイダがあなたのweb.configファイルのsystem.webセクションにこれを追加することで使用できます

<sessionState cookieless="true" regenerateExpiredSessionId="true" mode="Custom" customProvider="MySessionProvider"> 
     <providers> 
      <add name="MySessionProvider" type="MySession.MySessionProvider"/> 
     </providers> 
    </sessionState> 

私は、圧縮/暗号化されたセッション・ステートを作成するために使用されるこの技術を見てきました。

public class KeyValueIndexer<K,V> 
{ 
    private Dictionary<K, V> myVal = new Dictionary<K, V>(); 

    public V this[K k] 
    { 
     get 
     { 
      return myVal[k]; 
     } 
     set 
     { 
      myVal.Add(k, value); 
     } 
    } 
} 

人クラス::MSDNの例の私のわずかな変動が

1

後で

class Person 
{ 
    public string FirstName { get; set; } 
    public string LastName { get; set; } 
    public string MiddleName { get; set; } 
} 

使用法:

static void Main(string[] args) 
     { 
      KeyValueIndexer<string, object> _keyVal = new KeyValueIndexer<string, object>(); 
      _keyVal[ "Person" ] = new Person() { FirstName="Jon", LastName="Doe", MiddleName="S" }; 
      _keyVal[ "MyID" ] = 123; 
      Console.WriteLine("My name is {0} {1}, {2}", ((Person) _keyVal [ "Person" ]).FirstName, ((Person) _keyVal[ "Person" ]).MiddleName, ((Person) _keyVal[ "Person" ]).LastName); 
      Console.WriteLine("My ID is {0}", ((int) _keyVal[ "MyID" ])); 
      Console.ReadLine(); 
     } 
[私は角括弧をオーバーロードするにはどうすればよいの
関連する問題