如何获取使用顶级语句的 C# 9 程序的反射类型信息?

How do I get the Reflection TypeInfo of a C# 9 program that use Top-level statements?

假设我有一个用 C# 9 编写的简单脚本,如下所示:

using System;
using System.IO;

// What to put in the ???
var exeFolder = Path.GetDirectoryName(typeof(???).Assembly.Location);

之前,有了完整的程序,我们可以使用 Main class 作为“指标” class。 thisthis.GetType() 不可用,因为从技术上讲它在静态方法中。我现在如何获得它?


我在输入问题时想到的解决方法是 Assembly.GetCallingAssembly():

var exeFolder = Path.GetDirectoryName(Assembly.GetCallingAssembly().Location);

它适用于我的情况,但我只能得到 Assembly,而不是代码为 运行.

TypeInfo

您还可以使用 GetEntryAssembly.

获取程序集

一旦你有了你的代码所在的程序集,你就可以得到它的EntryPoint,这是编译器生成的“Main”方法。然后你可以做 DeclaringType 得到 Type:

Console.WriteLine(Assembly.GetEntryAssembly().EntryPoint.DeclaringType);

以上应该得到编译器生成的“Program”class,即使你不在顶层。

我建议从正在执行 (Main) 的 方法 开始:

TypeInfo result = MethodBase
  .GetCurrentMethod() // Executing method         (e.g. Main)
  .DeclaringType      // Type where it's declared (e.g. Program)
  .GetTypeInfo();    

如果你想要Type,而不是TypeInfo放弃最后一个方法:

Type result = MethodBase
  .GetCurrentMethod() // Executing method         (e.g. Main)
  .DeclaringType;     // Type where it's declared (e.g. Program)

 

对于 C# 10 (See 4th point in the breaking changes),编译器为顶级语句生成 Program class,因此您可以使用它:

Console.WriteLine(typeof(Program).FullName);

尽管原始 (C# 9) docs 指出:

Note that the names "Program" and "Main" are used only for illustrations purposes, actual names used by compiler are implementation dependent and neither the type, nor the method can be referenced by name from source code.

ASP.NET Core 集成测试文档依赖于 class.

的命名约定