У меня просто была похожая идея. Я хотел иметь статический класс со значениями константных строк для моих пользовательских настроек, чтобы использовать строгий тип, а не строку в привязке форм Windows:
this.textBox1.DataBindings.Add("Text", Properties.Settings.Default, Properties.Settings.PropertyNames.SomeStringValue);
Однако я понял, что шаблон t4 не может получить доступ к типам текущего проекта.
Вы должны загрузить файл с
<#@ assembly name="$(TargetPath)" #>
Однако, если вы сделаете это и создадите новый шаблон, вы не перестроите свой проект, поскольку файл используется, пока вы не закроете Visual Studio.
Короче говоря,
Я отбросил этот подход, и теперь я сам читаю файл app.config, чтобы получить нужные мне данные.
Должно быть довольно легко изменить, чтобы вместо этого прочитать файл Resources.xml
.
<#@ template debug="true" hostspecific="true" language="C#" #>
<#@ output extension=".cs" #>
<#@ assembly name="System.Core" #>
<#@ assembly name="System.Xml" #>
<#@ assembly name="System.Xml.Linq" #>
<#@ import namespace="System.IO" #>
<#@ import namespace="System.Linq" #>
<#@ import namespace="System.Xml.Linq" #>
<#
var xmlFile = Path.Combine(Path.GetDirectoryName(Host.TemplateFile), "..", "app.config");
var query = from x in XElement.Load(xmlFile).Element("userSettings").Element("Your.Namespace.Properties.Settings").Elements("setting")
select x;
#>
namespace Your.Namespace.Properties
{
public sealed partial class Settings
{
public static class PropertyNames
{
<# foreach (var item in query) { #>
public static readonly string <#=item.Attribute("name").Value#> = @"<#=item.Attribute("name").Value#>";
<# } #>
}
}
}