c#类生成,用于在会话状态中存储值

时间:2012-11-15 21:37:04

标签: c# .net t4

我想要的是一个类(或列表或其他),我可以说:

String ClientName;
String DealerID;

它会为我生成代码,如

public static string ClientName
{
    get
    {
        object obj = HttpContext.Current.Session["clientName"];

        if (obj != null)
        {
            return (string)obj;
        }

        return null;
    }

    set
    {
        HttpContext.Current.Session["clientName"] = value;
    }
}

一种方法可能是使用反射,但我不知道如何。
另一个解决方案可能是使用类型化数据集,但我不知道如何。
另一种方式可能是使用T4模板,但我不知道如何。

4 个答案:

答案 0 :(得分:1)

您可以创建code snippet。将此代码保存到文件propsession.snippet并将文件放到目录%USERPROFILE%\Documents\Visual Studio 2012\Code Snippets\Visual Basic\My Code Snippets

<?xml version="1.0" encoding="utf-8"?>
<CodeSnippets xmlns="http://schemas.microsoft.com/VisualStudio/2005/CodeSnippet">
  <CodeSnippet Format="1.0.0">
    <Header>
      <SnippetTypes>
        <SnippetType>Expansion</SnippetType>
      </SnippetTypes>
      <Title>propsession</Title>
      <Author>Lazy</Author>
      <Description>Code snippet for creating property stored in session</Description>
      <HelpUrl></HelpUrl>
      <Shortcut>propsession</Shortcut>
    </Header>
    <Snippet>
      <Declarations>
        <Literal Editable="true">
          <ID>type</ID>
          <ToolTip>Property type</ToolTip>
          <Default>string</Default>
          <Function>
          </Function>
        </Literal>
        <Literal Editable="true">
          <ID>Name</ID>
          <ToolTip>Property name</ToolTip>
          <Default>Name</Default>
          <Function>
          </Function>
        </Literal>
        <Literal Editable="true">
          <ID>key</ID>
          <ToolTip>Key</ToolTip>
          <Default>key</Default>
          <Function>
          </Function>
        </Literal>
      </Declarations>
      <Code Language="csharp"><![CDATA[public static $type$ $Name$
{
    get
    {
        object obj = HttpContext.Current.Session["$key$"];

        if (obj != null)        
            return ($type$)obj;        

        return null;
    }

    set { HttpContext.Current.Session["$key$"] = value;  }
}]]></Code>
    </Snippet>
  </CodeSnippet>
</CodeSnippets>

开始在Visual Studio中键入propsession,然后选择此代码段。它将插入用于在会话中存储属性值的代码。

答案 1 :(得分:1)

T4样本:

<#
    // Here is the model
    Model = new []
        {
            P ("string", "ClientName"),
            P ("string", "DealerID"),
        };
#>

<#
    // Here is the "view", this can be extracted into a ttinclude file and reused
#>
namespace MyNameSpace
{
    using System.Web;

    partial class SessionState
    {
<#
    foreach (var propertyDefinition in Model)
    {
#>
        public static <#=propertyDefinition.Type#> <#=propertyDefinition.Name#>
        {
            get
            {
                object obj = HttpContext.Current.Session["<#=propertyDefinition.SessionName#>"];

                if (obj != null)
                {
                    return (<#=propertyDefinition.Type#>)obj;
                }

                return null;
            }

            set
            {
                HttpContext.Current.Session["<#=propertyDefinition.SessionName#>"] = value;
            }
        }    
<#
    }
#>
    }
}
<#+

    PropertyDefinition[] Model = new PropertyDefinition[0];

    class PropertyDefinition
    {
        public string Type;
        public string Name;

        public string SessionName
        {
            get
            {
                var name = Name ?? "";
                if (name.Length == 0)
                {
                    return name;
                }

                return char.ToLower(name[0]) + name.Substring(1);

            }
        }
    }

    static PropertyDefinition P (string type, string name)
    {
        return new PropertyDefinition
        {
            Type = type ?? "<NoType>",
            Name = name ?? "<NoName>",
        };
    }

#>

它生成以下代码:

namespace MyNameSpace
{
    using System.Web;

    partial class SessionState
    {
            public static string ClientName
        {
            get
            {
                object obj = HttpContext.Current.Session["clientName"];

                if (obj != null)
                {
                    return (string)obj;
                }

                return null;
            }

            set
            {
                HttpContext.Current.Session["clientName"] = value;
            }
        }    
            public static string DealerID
        {
            get
            {
                object obj = HttpContext.Current.Session["dealerID"];

                if (obj != null)
                {
                    return (string)obj;
                }

                return null;
            }

            set
            {
                HttpContext.Current.Session["dealerID"] = value;
            }
        }    
        }
}

如果你提取“视图”,模型文件将如下所示:

<#
    // Here is the model
    Model = new []
        {
            P ("string", "ClientName"),
            P ("string", "DealerID"),
        };
#>

<#@ include file="$(SolutionDir)\GenerateSessionState.ttinclude"#>

关于CodeSnippets vs T4

有时人们认为CodeSnippets(和Resharper代码模板)等同于T4。他们不是。

CodeSnippets(和其他)促进代码冗余,基本上是CopyPaste编程,具有额外的工具支持。

T4(或CodeSmith)是MetaProgramming工具,可帮助您减少所维护代码中的代码冗余(它们可能会生成冗余代码,但您无需维护该代码)。

关于CodeSnippets的思考实验;你已经广泛使用了一个片段,但你发现它生成的代码存在问题。

你是如何解决的?您必须找到您使用代码段的所有实例并调整代码但遇到问题;你如何找到所有实例?当有人修改了片段代码时,如何合并更改?

使用MetaTrogramming工具(如T4或CodeSmith)修复模板并重新生成代码。

这就是为什么每当有人提到代码片段时我就会死掉一些内容。

答案 2 :(得分:1)

我为CodeSmith Tools工作,你可以很容易地使用CodeSmith Generator。我们有一个名为ActiveSnippets的功能。您可以通过注册模板来创建新的ActiveSnippet。我花了大约30秒来创建以下模板来实现这一目标:

<%@ Template Language="C#" TargetLanguage="C#" Description="http://stackoverflow.com/questions/13406669/c-sharp-class-generation-for-storing-values-in-the-session-state" %>
<%@ Property Name="PropertyName" Default="SomeValue" Type="System.String" %>
<%@ Property Name="SystemType" Default="string" Type="System.String" %>

public static <%= SystemType %> <%= PropertyName %>
{
    get
    {
        object obj = HttpContext.Current.Session["<%= PropertyName %>"];
        if (obj != null)
        {
            return (string)obj;
        }

        return null;
    }

    set
    {
        HttpContext.Current.Session["<%= PropertyName %>"] = value;
    }
}

要使用ActiveSnippet,您需要使用上面的内容创建一个新模板,并按照上面链接中的步骤注册ActiveSnippet(E.G.,MySnippetName)。然后只需在Visual Studio中的代码文档内的新行上输入MySnippetName ClientName String,然后按control + e两次以执行该代码段。生成的代码将输出到您键入MySnippetName ClientName String,

的文档窗口

如果您有任何疑问,请告诉我们!

P.S。,你会发现我们有比T4更好的模板语法/ API,集成故事和模板编辑器(他们从我们这里偷了一堆:)。此外,与片段不同,生成器模板可以从任何元数据(database / xml ....)呈现任何基于文本的内容,并使用任何.NET API,包括第三方库。

答案 3 :(得分:0)

MS有一个关于如何使用T4模板的视频:http://msdn.microsoft.com/en-us/vstudio/cc308634.aspx