2009-09-24 8 views
7

Je souhaite créer un objet qui fonctionnera de manière similaire à la session ASP.Net.Utilisation personnalisée des indexeurs []

si elle ne marche pas existe ou mettre à jour dire que j'appelle cette MaSession objet, je veux le faire alors quand vous

mySession["Username"] = "Gav" 

Il ajoutera soit à une table de base de données si elle le fait. Je peux écrire une méthode pour le faire, mais je n'ai aucune idée de comment l'obtenir quand il est utilisé avec la syntaxe de l'indexeur ([]). Je n'ai jamais construit un objet qui fasse quelque chose comme ça avec les indexeurs. Avant que quelqu'un ne dise quelque chose, je sais que la session ASP.Net peut enregistrer dans la base de données, mais dans ce cas, j'ai besoin d'une solution personnalisée légèrement plus simple. N'importe quel pointeur ou exemple d'utilisation d'indexeurs de cette manière serait génial.

Merci

+0

double possible de [Comment surcharger le support carré opérateur en C#?] (https://stackoverflow.com/questions/287928/how-do-i-overload-the-square-bracket-operator-in-c) – ardila

Répondre

20

Il est en fait à peu près la même chose que d'écrire une propriété typique:

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 
    } 
} 

La seule différence est que nous utilisons le mot-clé "this" au lieu de lui donner un nom propre:

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

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

C'est génial, il ressemble à ce que je suis après. Une question cependant est-il possible de l'utiliser sans avoir à déclarer une instance de la classe? J'ai essayé de le rendre statique mais ça n'a pas l'air de marcher. – Gavin

+1

Non, vous ne pouvez pas le faire sans déclarer une instance. Voir http://stackoverflow.com/questions/154489/are-static-indexers-not-supported-in-c – Yuliy

6

De l'MSDN documentation:

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

Les indexeurs en C# sont des propriétés portant le nom this. Voici un exemple ...

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

Si vous êtes désireux d'utiliser votre classe pour contrôler l'état de session ASP.NET, regardez à implémenter la classe SessionStateStoreProviderBase et de l'interface IRequiresSessionState. Vous pouvez alors utiliser votre fournisseur de session en ajoutant ceci à la section system.web de votre web.config:

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

Je l'ai vu cette technique utilisée pour la création de session-états comprimés/chiffrés.

1

Après ma légère variation par exemple MSDN:

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); 
     } 
    } 
} 

Personne Classe:

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

Utilisation:

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(); 
     } 
Questions connexes