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;
    }
}

1つの方法は反射を使用することかもしれませんが、方法がわかりません。
別の解決策は、型付きデータセットを使用することかもしれませんが、やはり方法がわかりません。
別の方法は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>

propsessionVisual 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

私はCodeSmithToolsで働いていますが、CodeSmithGeneratorを使用すると非常に簡単にこれを行うことができます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)を登録する必要があります。次に、VisualStudioのコードドキュメント内の新しい行にMySnippetNameClientName Stringと入力し、control+eを2回押してスニペットを実行します。生成されたコードは、MySnippetNameClientNameStringと入力したドキュメントウィンドウに出力されます。

ご不明な点がございましたら、お気軽にお問い合わせください。

PS、T4よりもはるかに優れたテンプレート構文/ API、統合ストーリー、およびテンプレートエディターがあることがわかります(彼らは私たちからたくさんを盗みました:)。また、スニペットとは異なり、ジェネレータテンプレートは、任意のメタデータ(database / xml ....)から任意のテキストベースのコンテンツをレンダリングし、サードパーティライブラリを含む任意の.NETAPIを使用できます。

于 2012-12-31T15:31:34.223 に答える
0

MSには、T4テンプレートの使用方法に関するビデオがあります:http://msdn.microsoft.com/en-us/vstudio/cc308634.aspx

于 2012-11-15T21:47:39.800 に答える