【发布时间】:2012-09-20 13:39:07
【问题描述】:
我敢肯定这是一个非常奇怪的要求,但还是这样吧。
我们有一些客户配置代码,这些代码由我们编译到类库中的 C# 类表示。创建这些配置类目前是我想分配给开发人员以外的其他人的猴子工作。因此,我们正在构建一个“配置器”网站,业务分析师可以使用该网站来生成有效的 C# 类,方法是填写一个选择了相关选项的表单。
从 MVC 网站中的模板生成 C# 类的最佳方法是什么?请注意,我在这里不是在谈论在运行时动态生成和执行一个类:我们实际上是在生成一个文本文件,该文件恰好包含将包含在一个完全不同的项目中的 C# 代码。
这被证明是一个很难正确谷歌的话题!到目前为止出现的选项...
- 只需使用标记化的文本文件并使用 String.Format 替换值
- 以某种方式使用 Razor 作为模板引擎(但不确定如何使用,而且我们生成的不是 html)
- 不知何故使用 T4 模板(至少我知道它是用来生成 C#,但不确定如何在运行时执行)
关于如何最好地解决这个问题的任何想法?
根据要求,这是输出类/文件的示例。此处的值会覆盖带有客户特定标签、验证等的基类中设置的值。这就是我们为客户定制产品的方式。
public class AreaRiskTemplate: AreaRiskTemplateBase
{
public override string EntityName { get { return "risk"; } }
public override string EntityNamePlural { get { return "risks"; } }
public override string EntityNameArticle { get { return "a"; } }
public override string CGovItemRefPrefix { get { return "R"; } }
public override void SetFieldDefinitions()
{
FieldDefinitions.Level1.IsImplemented = true;
FieldDefinitions.Level1.Label = "Category";
FieldDefinitions.Level1.IsVisibleInGrid = true;
FieldDefinitions.Level2.IsImplemented = true;
FieldDefinitions.Level2.Label = "Team";
FieldDefinitions.Level2.IsVisibleInGrid = true;
FieldDefinitions.Description.IsImplemented = true;
FieldDefinitions.Description.Label = "Description";
FieldDefinitions.Description.IsVisibleInGrid = true;
}
public override ModelStateDictionary Validate()
{
var msd = new ModelStateDictionary();
// add template-specific validation here
msd.Merge(base.Validate());
return msd;
}
public override List<string> Level1Options
{
get
{
return new List<string>
{
"Organisational",
"Financial",
"Operational",
"External",
"IT"
};
}
}
}
更新:目前正在http://msdn.microsoft.com/en-us/library/ee844259(v=vs.100).aspx 调查 T4 模板(感谢下面的 cmets)。看起来很有希望。
【问题讨论】:
-
msdn.microsoft.com/en-us/library/bb126445.aspx 似乎包含有关在运行时开始使用 T4 的详细信息。
-
你能发一个这个配置文件的例子吗?
标签: c# asp.net-mvc templates razor t4