<>c__DisplayClass0_0.<<CreateBinderDelegate>g__Bind|0>d 部分由 C# 编译器生成。在引用的情况下,它是专门为 the local function Bind 在方法 CreateBinderDelegate 中生成的,该方法属于 ControllerBinderDelegateProvider 类,位于命名空间 Microsoft.AspNetCore.Mvc.Controllers 下。
要了解名称的各个部分,请遵循编译器/Roslyn 源代码中的GeneratedNames.MakeLocalFunctionName。它调用了主力方法MakeMethodScopedSynthesizedName。
实现细节可能会随着时间而改变,但现在,这里是<>c__DisplayClass0_0.<<CreateBinderDelegate>g__Bind|0>d 的粗略细分,您可以看到它由几个部分组成:
<>c__DisplayClass0_0
<CreateBinderDelegate>g__Bind|0
-
<...>d 或 <<CreateBinderDelegate>g__Bind|0>d
注意,在第三种情况下,第二种是嵌入的。
MakeMethodScopedSynthesizedName 创建的所有合成名称基于参数名称具有以下模式:
"<" methodName? ">" kind
( "__" suffix suffixTerminator? )?
( methodOrdinal ("#" methodGeneration )?
| entityOrdinal ("#" entityGeneration )?
| methodOrdinal ("#" methodGeneration )?
"_"
entityOrdinal ("#" entityGeneration )?
)?
在上述模式中,引号("...")中的任何内容都是文字,括号((...))用于分组,? 表示可选,| 表示或, methodName 和 suffix 等标识符表示 MakeMethodScopedSynthesizedName 参数的值。
<>c__DisplayClass0_0 部分是通过调用GeneratedNames.MakeLambdaDisplayClassName 生成的:
MakeMethodScopedSynthesizedName(GeneratedNameKind.LambdaDisplayClass,
methodOrdinal, generation,
suffix: "DisplayClass",
entityOrdinal: closureOrdinal,
entityGeneration: closureGeneration);
由于methodName为空,合成名称以<>开头,c来自GeneratedNameKind.LambdaDisplayClass,后缀显然是DisplayClass,0_0来自假设methodOrdinal和@ 987654359@ 在该呼叫中为零。
您可以按照来源查看其他部分是如何使用MakeMethodScopedSynthesizedName 的变体构建的,但简而言之:
-
<CreateBinderDelegate>g__Bind|0 部分是通过调用GeneratedNames.MakeLocalFunctionName 生成的。
MakeMethodScopedSynthesizedName(GeneratedNameKind.LocalFunction, methodOrdinal, methodGeneration, methodName, localFunctionName, GeneratedNameConstants.LocalFunctionNameTerminator, lambdaOrdinal, lambdaGeneration);
-
<...>d 部分由GeneratedNames.MakeStateMachineTypeName 生成,其中... 来自methodName 值:
MakeMethodScopedSynthesizedName(GeneratedNameKind.StateMachineType, methodOrdinal, generation, methodName);