源生成器可以生成以匿名类型为参数的方法吗?

Can a source generator generate methods with anonymous types as parameters?

提问人:Bogey 提问时间:10/27/2023 更新时间:10/28/2023 访问量:53

问:

源生成器是否可以扫描程序集以查找使用的匿名类型,并专门为这些类型生成扩展方法?

例如,假设您有以下代码

   var anon = new { Test = 123;}
   anon.SomeExtensionMethod(); // SomeExtensionMethod does not (yet) exist

源生成器可以用来生成吗?SomeExtensionMethod

我已经快速尝试了一下。当源生成器运行时,匿名类型的名称和类型信息可用。但是,它们的名称包含非编译器生成的代码中无效的字符,因此我的尝试导致了类似

public static class SourceGeneratedCode
{
  public static void SomeExtensionMethod(this global::<anonymous type: int Test> value) { }
}

当然不会编译。所以我想知道 - 有什么办法可以做到这一点吗?

我想为不同的匿名类型生成此方法的不同实现;意思是,不能只是接受,或者是通用的或类似的。SomeExtensionMethodobject

C# Roslyn 源生成器

评论

6赞 Damien_The_Unbeliever 10/27/2023
这几乎总是表明匿名类型不再适合在这里使用,你应该,好吧,只创建一个实际的类型。
0赞 MakePeaceGreatAgain 10/27/2023
当然这是可能的。源代码生成器只是解析您的代码,因此您只需要找到与匿名类型匹配的模式即可。
0赞 MakePeaceGreatAgain 10/27/2023
但我同意 Damien 的观点:首先使用非匿名类型有什么问题?当你需要对你的匿名类型进行任何假设时——例如,这个类型有一个 int-property,另一个有两个字符串——它有效地将你的类型变成不那么异常的类型。
0赞 Bogey 10/27/2023
一般的想法是源生成一些东西,例如 javascript 的扩展运算符,这使得类型的函数转换更加方便。匿名类型将是这种代码/操作风格的一个很好的起点,因为它们可以方便地内联定义它们。值元组几乎也可以工作,如果不是因为它们的名称不是其类型标识的真正组成部分/会在此类转换中丢失

答:

1赞 Jason Malinowski 10/28/2023 #1

不,这是不可能的,因为生成器仍然必须生成“常规”源代码,并且无法命名匿名类型。