c #: преобразование Get / Set из vb.net в c # - PullRequest
4 голосов
/ 10 марта 2010

Может кто-нибудь помочь.

У меня есть следующее в vb.net, и мне нужно преобразовать его в c #. Сначала это казалось довольно простым, но мне нужно передать переменную NamedObject, а также welll, которая поддерживается в vb.net, но не в c # ..

Какие у меня варианты.

Вот vb.net - обратите внимание на NamedObject

    Public Property Datos(ByVal NamedObject As String) As T
        Get
            Return CType(HttpContext.Current.Session.Item(NamedObject ), T)
        End Get
        Set(ByVal Value As T)
            HttpContext.Current.Session.Item(NamedObject ) = Value
        End Set
    End Property

и это c #, но это ошибка, так как кажется, что я не могу передать параметр в свойстве

    public T Datos(string NamedObject)
    {
        get { return (T)HttpContext.Current.Session[NamedObject]; }
        set { HttpContext.Current.Session[NamedObject] = Value; }
    }

Буду признателен за любой вклад.

Спасибо

Ответы [ 4 ]

4 голосов
/ 10 марта 2010

Вы ищете свойство индексатора. В основном реализуем свойство с именем this. Здесь есть хороший учебник .

Правда, вы ограничены одним индексатором, но вы сможете реализовать что-то вроде этого:

public T this[string namedObject]
{
    get { return (T)HttpContext.Current.Session[namedObject]; }
    set { HttpContext.Current.Session[namedObject] = Value; }
}
3 голосов
/ 10 марта 2010

C # не поддерживает именованные параметрические свойства, как VB.NET. Для того, чтобы сделать эту работу, вам нужно создать два метода, как это:

public T GetDatos(String NamedObject)
{
    return (T)HttpContext.Current.Session[NamedObject];
}
public void SetDatos(String NamedObject, T Value)
{
    HttpContext.Current.Session[NamedObject] = Value;
}
1 голос
/ 10 марта 2010

Чтобы эмулировать именованные индексированные свойства в C #, вам нужно создать прокси-объект следующим образом. Однако я бы предложил по возможности менее прямой перевод, например, как функцию.

class DatosProxy<T> {
    public T this[string name] {
        get { return (T)HttpContext.Current.Session[name]; }
        set { HttpContext.Current.Session[name] = value; }
    }
}

А затем, в вашем реальном классе, просто предоставьте получатель только для чтения:

private readonly DatosProxy _datos = new DatosProxy();

public DatosProxy Datos { get { return _datos; } }

Обратите внимание, что это не 100% эквивалентный код, но использование с точки зрения пользователя идентично.

0 голосов
/ 10 марта 2010

В C # вы можете создать индексатор, но не именованный индексатор:

public T this[string name]
{
    get { return (T)HttpContext.Current.Session[name]; }
    set { HttpContext.Current.Session[name] = Value; }
}

Можно создать коллекцию, которая использует состояние сеанса в качестве хранилища, и объявить свойство, которое возвращает коллекцию:

public class DatosCollection {

  public T this[string name] {
    get { return (T)HttpContext.Current.Session[name]; }
    set { HttpContext.Current.Session[name] = value; }
  }

}

private _collection = new DatosCollection();

public DatosCollection Datos { get { return _collection; } }
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...