我敢肯定这是一个非常奇怪的要求,但在这里。
我们有一些客户配置代码,这些代码由我们编译到类库中的 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 模板(感谢下面的评论)。看起来很有希望。