如何获取使用顶级语句的 C# 9 程序的 Reflection TypeInfo?

Luk*_* Vo 5 c# reflection c#-9.0 toplevel-statement

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

using System;
using System.IO;

// What to put in the ???
var exeFolder = Path.GetDirectoryName(typeof(???).Assembly.Location);
Run Code Online (Sandbox Code Playgroud)

之前,通过完整的程序,我们可以将该Main类用作“指示器”类。this并且this.GetType()不可用,因为从技术上讲它位于静态方法内。我现在怎样才能得到它?


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

var exeFolder = Path.GetDirectoryName(Assembly.GetCallingAssembly().Location);
Run Code Online (Sandbox Code Playgroud)

它适用于我的情况,但我只能获取Assembly,而不是TypeInfo代码正在运行的位置。

Swe*_*per 8

您还可以使用 来获取程序集GetEntryAssembly

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

Console.WriteLine(Assembly.GetEntryAssembly().EntryPoint.DeclaringType);
Run Code Online (Sandbox Code Playgroud)

Program即使您不在顶层,上面的内容也应该获得编译器生成的“ ”类。


Gur*_*ron 5

对于 C# 10(请参阅重大更改中的第四点),编译器会Program为顶级语句生成类,以便您可以使用它:

Console.WriteLine(typeof(Program).FullName);
Run Code Online (Sandbox Code Playgroud)

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

请注意,名称“Program”和“Main”仅用于说明目的,编译器使用的实际名称取决于实现,并且类型和方法都不能通过源代码中的名称引用。

ASP.NET Core集成测试文档依赖于该类的命名约定。


Dmi*_*nko 3

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

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

如果你愿意Type,不要TypeInfo放弃最后一个方法:

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

 
Run Code Online (Sandbox Code Playgroud)