gpt4 book ai didi

c# - 有什么东西可以使 T4 代码更……干净吗?

转载 作者:太空狗 更新时间:2023-10-29 19:39:34 25 4
gpt4 key购买 nike

我有一个相当复杂的东西塞进了 T4 模板。基本上我采取类似的东西

{=foo=} more text...

并将其转换为类( View ),如下所示:

public class MyView
{
public string foo{get;set;}
public string Write()
{
return foo+@" more text...";
}
}

生成的代码当然比这复杂得多。不管怎样,T4 模板现在有超过 600 行代码,而且真的很快变得难以管理。我认为主要问题是混合代码和“内容”(即静态代码)。我不太确定如何彻底解决这个问题(当然不会影响生成的代码)。我也没有看到任何可行的方法来单元测试我的 T4 代码,除了简单地测试它的 T4 执行错误。当然,测试它生成的代码似乎是一项几乎不可能完成的任务。

是否有任何“模型- View ”类型的框架或技术可用于使我的 T4 模板代码更简洁?

最佳答案

恕我直言,编写复杂模板时最重要的两个概念是

  1. 分离模型和 View - 这有助于将模板逻辑保持在最低限度(通常是维护问题的原因)。我个人认为这不需要框架,只需要你去做。
  2. Partial is your friend - 我通常使用 T4 从模型生成骨架代码。特定行为可能不值得付出努力放入模型中,最好通常通过使用部分类或方法允许该行为进入。

没那么重要但很好

  1. 使代码可搜索 - 我不依赖 T4 Addons,因为我发现它们都不够好,缺乏 IntelliSense 来导航代码我必须使代码可搜索.它可以很简单,而不是调用 Column 属性名称,我将其称为 ColumnName。
  2. 在输出中插入“标签” - 更容易找到生成那部分输出的代码。

示例分离模型/ View :

<#
// Model for Dependency Pooperties
Model = new []
{
new ClassDefinition ("MyDataGrid")
{
P ("CultureInfo" , "CultureInfo"),
P ("Pen" , "CellBorderPen"),
P ("IEnumerable<object>" , "Rows"),
C ("WColumnDefinition" , "Columns"),
},
};
#>
// Include the view
<#@ include file="..\T4\DependencyProperties.ttinclude" #>

然后 View 遍历模型并生成依赖属性。

然后依赖属性的行为被实现为部分方法

    partial void Changed_Columns(
ObservableCollection<WColumnDefinition> oldValue,
ObservableCollection<WColumnDefinition> newValue
)
{
HookUpColumns(oldValue, null);
HookUpColumns(newValue, this);
}

请注意,将此特定行为放入模型中会使模型显着复杂化。

最后;即使是有能力的程序员也需要时间才能胜任地编写元程序。在我确定一种我认为可以维护的风格之前,我进行了多次尝试,但对我来说,这是值得的,因为我能够更快地交付质量。

我希望这有助于...

附言。我认为没有人会说 T4 永远优雅,但它仍然非常有用。

关于c# - 有什么东西可以使 T4 代码更……干净吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/13116123/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com