この目的で CodeSmith テンプレートを使用することもできます。利点は、ビルドごとに再生成されるようにテンプレート ファイルのプロパティを設定できることです (BuildAction = "Complile" を設定します)。
編集
私もそのような解決策を探しました。グーグルで調べた後、そのようなクラスを生成するベース T4 テンプレートを見つけました。私はそれを再設計しました、そしてあなたはそれを以下で見つけることができます。
テンプレートは、Web.config/App.config ファイルから appSetting セクションのラッパー クラスを生成しています
設定ファイルに次の設定行があるとします
<appSettings>
<add key="PageSize" value="20" />
<add key="CurrentTheme" value="MyFavouriteTheme" />
<add key="IsShowSomething" value="True" />
</appSettings>
テンプレートを処理した後、次のクラスを取得します
namespace MyProject.Core
{
/// <remarks>
/// You can create partial class with the same name in another file to add custom properties
/// </remarks>
public static partial class SiteSettings
{
/// <summary>
/// Static constructor to initialize properties
/// </summary>
static SiteSettings()
{
var settings = System.Configuration.ConfigurationManager.AppSettings;
PageSize = Convert.ToInt32( settings["PageSize"] );
CurrentTheme = ( settings["CurrentTheme"] );
IsShowSomething = Convert.ToBoolean( settings["IsShowSomething"] );
}
/// <summary>
/// PageSize configuration value
/// </summary>
public static readonly int PageSize;
/// <summary>
/// CurrentTheme configuration value
/// </summary>
public static readonly string CurrentTheme;
/// <summary>
/// IsShowSomething configuration value
/// </summary>
public static readonly bool IsShowSomething;
}
}
次のコードを *.tt ファイルに保存し、生成されたファイルを配置するプロジェクトにインクルードします。ビルドごとにクラスを再生成するには、ここで私の回答を参照してください
テンプレートは、値から文字列、日時、int、およびブール型を認識します
<#@ assembly name="System.Core" #>
<#@ assembly name="System.Xml" #>
<#@ assembly name="System.Xml.Linq" #>
<#@ import namespace="System" #>
<#@ import namespace="System.Text" #>
<#@ import namespace="System.IO" #>
<#@ import namespace="System.Linq" #>
<#@ import namespace="System.Xml.Linq" #>
<#@ import namespace="Microsoft.VisualBasic" #>
<#@ template language="VB" debug="True" hostspecific="True" #>
<#@ output extension=".Generated.cs" #>
<#
Dim projectNamespace as String = "MyProject.Core"
Dim className as String = "SiteSettings"
Dim fileName as String = "..\..\MyProject.Web\web.config"
Init(fileName)
#>
//------------------------------------------------------------------------------
// FileName = <#= path #>
// Generated at <#= Now.ToLocaltime() #>
//
// <auto-generated>
// This code was generated by a tool.
//
// Changes to this file may cause incorrect behavior and will be lost if
// the code is regenerated.
//
// NOTE: Please use the Add a Reference to System.Configuration assembly if
// you get compile errors with ConfigurationManager
// </auto-generated>
//------------------------------------------------------------------------------
using System;
using System.Configuration;
namespace <#= projectNamespace #>
{
/// <remarks>
/// You can create partial class with the same name in another file to add custom properties
/// </remarks>
public static partial class <#= className #>
{
/// <summary>
/// Static constructor to initialize properties
/// </summary>
static <#= className #>()
{
var settings = System.Configuration.ConfigurationManager.AppSettings;
<#= AddToCostructor(path) #> }
<#= RenderApplicationSettings(path) #> }
}
<#+
Dim path as String = ""
Dim doc as XDocument = Nothing
Public Sub Init(fileName as String)
Try
path = Host.ResolvePath(fileName)
If File.Exists(path) Then
doc = XDocument.Load(path)
End If
Catch
path = "<< App.config or Web.config not found within the project >>"
End Try
End Sub
Public Function AddToCostructor(ByVal path as String) as String
If doc Is Nothing Then Return ""
Dim sb as New StringBuilder()
For Each result as XElement in doc...<appSettings>.<add>
sb.Append(vbTab).Append(vbTab).Append(vbTab)
sb.AppendFormat("{0} = {1}( settings[""{0}""] );", result.@key, GetConverter(result.@value))
sb.AppendLine()
Next
Return sb.ToString()
End Function
Public Function RenderApplicationSettings(ByVal path as String) as String
If doc Is Nothing Then Return ""
Dim sb as New StringBuilder()
For Each result as XElement in doc...<appSettings>.<add>
dim key = result.@key
sb.Append(vbTab).Append(vbTab)
sb.Append("/// <summary>").AppendLine()
sb.Append(vbTab).Append(vbTab)
sb.AppendFormat("/// {0} configuration value", key).AppendLine()
sb.Append(vbTab).Append(vbTab)
sb.Append("/// </summary>").AppendLine()
sb.Append(vbTab).Append(vbTab)
sb.AppendFormat("public static readonly {0} {1}; ", GetPropertyType(result.@value), key)
sb.AppendLine().AppendLine()
Next
Return sb.ToString()
End Function
Public Shared Function GetConverter(ByVal prop as String) as String
If IsNumeric(prop) Then Return "Convert.ToInt32"
If IsDate(prop) Then Return "Convert.ToDateTime"
dim b as Boolean
If Boolean.TryParse(prop, b) Then Return "Convert.ToBoolean"
Return ""
End Function
Public Shared Function GetPropertyType(ByVal prop as String) as String
If IsNumeric(prop) Then Return "int"
If IsDate(prop) Then Return "DateTime"
dim b as Boolean
If Boolean.TryParse(prop, b) Then Return "bool"
Return "string"
End Function
#>