我正在寻找一种方法来使用泛型,这些泛型仅在编译时存在以用于代码重用:不必复制/粘贴类和方法。基本上是文本替换,比如宏,有一些类型检查。更像是C ++模板。
我要问的原因是:
普通C#泛型坚持总是在运行时创建泛型类型(为什么??),
1)不仅会产生不必要的限制(例如,不能从类型参数继承,这将非常有用),
2)但是这些运行时泛型类型现在正在为我创建问题,因为.NET无法将它们序列化,因此当我将它们插入到RichTextBox中时,许多操作要么失败要么抛出“无法序列化泛型类型”异常。一切都在使用非泛型类型,但我想让代码更通用以添加内容,所以我添加了泛型(C# Generic Inheritance workaround),它们打破了一切。
感谢。
答案 0 :(得分:4)
虽然C#没有C ++风格的模板,但您可以尝试使用T4 (the Text Template Transformation Toolkit)来模仿它们。
您的文件看起来像:
<#@ 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
答案 1 :(得分:1)
它们被称为模板(不是“宏风格泛型”),它们在C#中不存在。
如果您有兴趣,请查看D;它有很多模板元编程功能,比C ++或C#更多(和IMO相比)。