我喜欢上面的访问者方法。然而,只是为了好玩,我展示了如何在 VS2008 和 VS2010 中使用 T4 减少代码冗余。
冗余来自您需要访问方法的每条消息。此外,每种方法都需要一个简单但冗余的 Accept 实现。接近“不要重复自己”的一种方法是使用 T4 生成代码。
为了测试以下示例,在 VS 中添加一个类,但将扩展名从 .cs 更改为 .tt。您现在将获得两个文件,一个 .tt 文件和一个连接到 .tt 文件的 .cs 文件。
.tt 文件是生成 .cs 文件的模板。当时它们是相同的。
将此用作 .tt 文件的内容:
<#@ template language="C#" #>
<#
// On VS2008 change C# above to C#v3.5
// -----------------------------------------------------
// Here we declare our different message types
var messageTypes = new []
{
"Simple",
"Complex",
"Other",
};
// -----------------------------------------------------
#>
namespace MessageProcessor
{
partial interface IMessageVisitor
{
<#
// Let's generate all message visitor methods
foreach (var messageType in messageTypes)
{
#>
void Visit (<#=messageType#>Message message);
<#
}
#>
}
abstract partial class Message
{
public abstract void Accept (IMessageVisitor visitor);
}
<#
// Let's generate all message types
foreach (var messageType in messageTypes)
{
#>
sealed partial class <#=messageType#>Message : Message
{
public override void Accept (IMessageVisitor visitor)
{
visitor.Visit (this);
}
}
<#
}
#>
}
这应该会生成一个如下所示的 CS 文件:
namespace MessageProcessor
{
partial interface IMessageVisitor
{
void Visit (SimpleMessage message);
void Visit (ComplexMessage message);
void Visit (OtherMessage message);
}
abstract partial class Message
{
public abstract void Accept (IMessageVisitor visitor);
}
sealed partial class SimpleMessage : Message
{
public override void Accept (IMessageVisitor visitor)
{
visitor.Visit (this);
}
}
sealed partial class ComplexMessage : Message
{
public override void Accept (IMessageVisitor visitor)
{
visitor.Visit (this);
}
}
sealed partial class OtherMessage : Message
{
public override void Accept (IMessageVisitor visitor)
{
visitor.Visit (this);
}
}
}
为什么这不那么冗余?因为现在每当我想添加新消息时,我只需将其添加到模板中:
var messageTypes = new []
{
"Simple",
"Complex",
"Other",
"YetAnotherOne",
};
重要的是要注意所有消息都是部分生成的,因为我们需要不同的消息有效负载。这是在另一个文件中指定的,它可能如下所示:
partial class SimpleMessage
{
public string Name;
}
partial class ComplexMessage
{
public XmlDocument Xml;
}
对于那些喜欢 T4 声音的人,请查看此博客:http ://www.olegsych.com/2008/09/t4-tutorial-creatating-your-first-code-generator/