当你想写一个泛型 的类型的时候,是否想过两个泛型参数、三个泛型参数、四个泛型参数或更多泛型参数的版本如何编写呢?是一个个编写?类小还好,类大了就杯具!
事实上,在 Visual Studio 中生成代码的手段很多,本文采用最笨的方式生成,但效果也很明显——代码写得轻松写得爽!
我们想要的效果
我们现在有一个泛型的版本:
public class Demo<T>
{
public Demo(Action<T> demo)
{
_demo = demo ?? throw new ArgumentNullException(nameof(action));
}
private Action<T> _demo;
public async Task<T> DoAsync(T t)
{
// 做某些事情。
}
// 做其他事情。
}
希望生成多个泛型的版本:
public class Demo<T1, T2>
{
public Demo(Action<T1, T2> demo)
{
_demo = demo ?? throw new ArgumentNullException(nameof(action));
}
private Action<T1, T2> _demo;
public async Task<(T1, T2)> DoAsync(T1 t1, T2 t2)
{
// 做某些事情。
}
// 做其他事情。
}
注意到类型的泛型变成了多个,参数从一个变成了多个,返回值从单个值变成了元组。
于是,怎么生成呢?
回顾 Visual Studio 那些生成代码的方式
Visual Studio 原生自带两种代码生成方式。
第一种:T4 文本模板
事实上 T4 模板算是 Visual Studio 最推荐的方式了,因为你只需要编写一个包含占位符的模板文件,Visual Studio 就会自动为你填充那些占位符。
那么 Visual Studio 用什么填充?是的,可以在模板文件中写 C# 代码!比如官方 DEMO:
<#@ output extension=".txt" #>
<#@ assembly name="System.Xml" #>
<#
System.Xml.XmlDocument configurationData = ...; // Read a data file here.
#>
namespace Fabrikam.<#= configurationData.SelectSingleNode("jobName").Value #>
{
... // More code here.
}
这代码写哪儿呢?在项目上右键新建项,然后选择“运行时文本模板”:
T4 模板编辑后一旦保存(Ctrl+S),代码立刻生成。
有没有觉得这代码着色很恐怖?呃……根本就没有代码着色好吗!即便如此,T4 本身也是非常强悍的代码生成方式。
这不是本文的重点,于是感兴趣请阅读官方文档 Code Generation and T4 Text Templates - Microsoft Docs 学习。