Я придумал решение, которое позволяет избежать определенных недостатков других опубликованных решений, сохранив структуру переменных сеанса в неизменном виде. Это просто типобезопасный ярлык для получения и установки переменных Session.
Это C #, но в конце я разместил несколько автоматически сгенерированных VB.NET.
Лучшие решения, которые я видел (принятый ответ и ответ TheObjectGuy), требуют пользовательского класса, который хранится в переменной Session, а затем извлекается из Session для доступа к его свойствам с помощью чего-то вроде MySessionClass.Current.MyProperty. ,
Проблема в том, что если вы в настоящее время используете (или можете использовать в будущем) что-то, кроме режима состояния сеанса InProc (см. https://msdn.microsoft.com/en-us/library/ms178586%28v=vs.140%29.aspx),), весь класс должен пройти сериализацию для доступа одно свойство.
Кроме того, это означает, что вы теряете реализации IEnumerable и ICollection, предлагаемые самим сеансом, если они вам нужны. С моим решением вы можете просто получить доступ к самому сеансу, если вам нужна эта функциональность.
Вы можете легко использовать эти переменные сеанса, и они являются типобезопасными. Его можно использовать вместе с такими операторами, как Session ["MyProperty"], что позволит преобразовывать существующий проект по одной ссылке за раз. Итак:
int myInt = (int)Session["MyInt"];
Session["MyInt"] = 3;
становится:
int myInt = SessionVars.MyInt;
SessionVars.MyInt = 3;
Вот фактический класс. CallerMemberName требует .NET 4.5, но даже если вы используете более старую версию, вы все равно можете управлять ей, явно передавая propertyName. Кроме того, типы свойств должны быть обнуляемыми, чтобы они действовали точно так же, как стандартные вызовы Session ["MyProp"], потому что не установлен
public static class SessionVars
{
private static T Get2<T>([System.Runtime.CompilerServices.CallerMemberName] string propertyName = "")
{
if (HttpContext.Current.Session[propertyName] == null)
{
return default(T);
}
return (T)HttpContext.Current.Session[propertyName];
}
private static void Set2<T>(T value, [System.Runtime.CompilerServices.CallerMemberName] string propertyName = "")
{
HttpContext.Current.Session[propertyName] = value;
}
public static int MyInt { get { return Get2<int>(); } set { Set2<int>(value); } }
public static bool MyBool { get { return Get2<bool>(); } set { Set2<bool>(value); } }
public static string MyString { get { return Get2<string>(); } set { Set2<string>(value); } }
}
Я даже написал фрагмент кода, чтобы облегчить добавление этих свойств:
<?xml version="1.0" encoding="utf-8"?>
<CodeSnippet Format="1.0.0" xmlns="http://schemas.microsoft.com/VisualStudio/2005/CodeSnippet">
<Header>
<Title>SessionVars Property</Title>
<Author>kevinpo</Author>
<Shortcut>sv</Shortcut>
<Description>Adds a property for use in a SessionVars class</Description>
<SnippetTypes>
<SnippetType>Expansion</SnippetType>
</SnippetTypes>
</Header>
<Snippet>
<Declarations>
<Literal>
<ID>type</ID>
<Default>int</Default>
</Literal>
<Literal>
<ID>property</ID>
<Default>PropertyName</Default>
</Literal>
</Declarations>
<Code Language="CSharp">
<![CDATA[public static $type$ $property$ { get { return Get2<$type$>(); } set { Set2<$type$>(value); } }]]>
</Code>
</Snippet>
</CodeSnippet>
Я парень на C #, поэтому этот VB.NET просто автоматически преобразуется в http://converter.telerik.com/:
Public NotInheritable Class SessionVars
Private Sub New()
End Sub
Private Shared Function Get2(Of T)(<System.Runtime.CompilerServices.CallerMemberName> Optional propertyName As String = "") As T
If HttpContext.Current.Session(propertyName) Is Nothing Then
Return Nothing
End If
Return DirectCast(HttpContext.Current.Session(propertyName), T)
End Function
Private Shared Sub Set2(Of T)(value As T, <System.Runtime.CompilerServices.CallerMemberName> Optional propertyName As String = "")
HttpContext.Current.Session(propertyName) = value
End Sub
Public Shared Property MyInt() As Integer
Get
Return Get2(Of Integer)()
End Get
Set
Set2(Of Integer)(value)
End Set
End Property
Public Shared Property MyBool() As Boolean
Get
Return Get2(Of Boolean)()
End Get
Set
Set2(Of Boolean)(value)
End Set
End Property
Public Shared Property MyString() As String
Get
Return Get2(Of String)()
End Get
Set
Set2(Of String)(value)
End Set
End Property
End Class
'=======================================================
'Service provided by Telerik (www.telerik.com)
'Conversion powered by NRefactory.
'Twitter: @telerik
'Facebook: facebook.com/telerik
'=======================================================