2009-09-24 3 views
7

Я хочу создать объект, который будет работать аналогично сеансу ASP.Net.Пользовательское использование индексаторов []

Сказать, что я называю этот объект mySession, я хочу сделать это так, когда вы делаете

mySession["Username"] = "Gav" 

Это будет либо добавить его в таблицу базы данных, если оно не существует или обновить его, если он делает. Я могу написать метод для этого, но не знаю, как заставить его срабатывать при использовании с синтаксисом индексатора ([]). Я никогда не строил объект, который делает что-то подобное с индексаторами.

Прежде чем кто-нибудь скажет что-нибудь, что я знаю, сессия ASP.Net может быть сохранена в базе данных, но в этом случае мне нужно немного более простое настраиваемое решение.

Любые указатели или примеры использования индексаторов таким образом были бы замечательными.

Благодаря

+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

От 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

Индексаторы в C# являются свойствами с именем this. Вот пример ...

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

Если Вы желаете использовать свой класс для управления ASP.NET состояния сеанса, смотрите реализовать SessionStateStoreProviderBase класс и IRequiresSessionState интерфейса. Затем вы можете использовать поставщик сеанса, добавив в раздел system.web вашего web.config:

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

Я видел этот метод, используемый для создания сжатого/шифрованного сеансового состояния.

1

Ниже мое небольшое изменение на примере 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); 
     } 
    } 
} 

лицо Класс:

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(); 
     } 
Смежные вопросы