1

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

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

4 回答 4

1

您可以创建代码片段。将此代码保存到文件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>

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

于 2012-11-15T22:27:27.807 回答
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 与 T4

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

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

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

围绕 CodeSnippets 的思想实验;您已经广泛使用了一个片段,但您意识到它生成的代码存在问题。

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

使用 T4 或 CodeSmith 等元编程工具,您可以修复模板并重新生成代码。

这就是为什么每次有人提到代码片段时我都会在内心深处死去。

于 2012-11-17T09:47:58.990 回答
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(EG,MySnippetName)。然后只需在 Visual Studio 的代码文档内的新行中输入 MySnippetName ClientName String,然后按两次 control+e 即可执行代码段。生成的代码将输出到您键入 MySnippetName ClientName String 的文档窗口,

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

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

于 2012-12-31T15:31:34.223 回答
0

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

于 2012-11-15T21:47:39.800 回答