我想要的是一个类(或列表或其他),我可以说:
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模板,但我不知道如何。
答案 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