6

我敢肯定这是一个非常奇怪的要求,但在这里。

我们有一些客户配置代码,这些代码由我们编译到类库中的 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 模板(感谢下面的评论)。看起来很有希望。

4

2 回答 2

1

我建议避免使用该网站,而直接使用 CodeSmith。您可以设计 CodeSmith 脚本,以便它会询问信息,然后生成所需的代码。尽管您必须购买 CodeSmith,但工作似乎少了很多。

于 2012-09-20T15:19:22.920 回答
0

以最少开销执行此操作的方法是使用 Microsoft 内置的CodeDOM API。它允许您使用跨语言兼容的文档对象模型构建和操作 CLR 代码文档。

这种方法的唯一缺点是,如何实现某些特定于语言的特性并不是很明显。一个示例是 C#readonly字段,因为它们并非在所有 CLR 语言中都可用,而仅在 C# 中可用。这种特殊复杂性的解决方案是使用 aCodeSnippet并将手动代码作为字符串插入。其他更复杂的不匹配问题可以通过将 CodeDOM 与模板引擎集成来缓解。Oleg Sych 写了一篇关于将 CodeDOM 与 T4 模板引擎集成的有用文章。我更喜欢这种方法而不是纯文本生成方法,因为强类型文档对象模型比纯文本更不容易出错。

此外,如果您确实想要编译输出代码,CodeDOM API 也支持这一点。

如果这是一种您认为可能会经常使用的做法,您可能希望使用构建器模式将一些常见的 DOM 操作功能包装到流利的方法调用中。我已经建立了一个使用这种方法的个人库,它通过代码生成非常成功地提高了我的工作效率。

于 2012-09-20T15:55:24.963 回答