C#宏风格的泛型

本文关键字:泛型 风格 | 更新日期: 2023-09-27 17:57:36

我正在寻找一种方法,让泛型只在编译时存在,以实现代码重用:不必复制/粘贴类和方法。基本上只是文本替换,就像宏一样,带有一些类型检查。更像C++模板。

我问的原因:

普通的C#泛型坚持总是在运行时创建泛型类型(为什么??),哪个

1) 不仅会产生不必要的限制(例如,不能从类型参数继承,这将非常有用)

2) 但是这些运行时泛型类型现在给我带来了问题,因为.NET无法序列化它们,所以当我将它们插入RichTextBox时,许多操作要么失败,要么引发"无法序列化泛型类型"异常。所有的东西都使用非泛型类型,但我想让代码更通用来添加东西,所以我添加了泛型(C#泛型继承解决方法),它们破坏了所有东西。

谢谢。

C#宏风格的泛型

虽然C#没有C++风格的模板,但您可以尝试使用T4(文本模板转换工具包)来模拟它们。

你的文件看起来像:

<#@ template language="C#" #>
<#@ output extension=".cs" #>
<#
    foreach (var T in new[]{"instantiate","for","these","types"})
    {
#>      
class FakeGeneric<#=T#>
{
    <#=T#> FakeGenericField;
}
<#  } #> 

这将生成如下类型:

class FakeGenericinstantiate
{
    instantiate FakeGenericField;
}
class FakeGenericfor
{
    for FakeGenericField;
}
// etc

MSDN上有一个关于使用T4生成这样的代码的页面。

它们被称为模板(而不是"宏样式泛型"),并且它们在C#中不存在。

如果你感兴趣,可以看看D;它有很多模板元编程功能,比C++或C#更多(而且IMO更好)。