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



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

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

之前,使用完整的程序,我们可以使用Main类作为";指示器";班CCD_ 2和CCD_。我现在该怎么办?


我在输入问题时想到的一个变通方法是Assembly.GetCallingAssembly():

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

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

您也可以使用GetEntryAssembly获取程序集。

一旦你有了代码所在的程序集,你就可以得到它的EntryPoint,这是编译器生成的";CCD_ 9";方法然后,您可以执行DeclaringType以获得Type:

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

以上应该得到编译器生成的";CCD_ 12";即使你没有达到最高水平,也要上课。

对于C#10(请参阅中断更改中的第4点(,编译器为顶级语句生成Program类,因此您可以使用它:

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

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

注意;程序";以及";主";仅用于说明目的,编译器使用的实际名称取决于实现,类型和方法都不能通过源代码中的名称引用。

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

我建议从正在执行的方法开始(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)

相关内容

  • 没有找到相关文章

最新更新