首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >如何获得使用顶级语句的C# 9程序的反射C#?

如何获得使用顶级语句的C# 9程序的反射C#?
EN

Stack Overflow用户
提问于 2020-12-06 02:42:40
回答 3查看 375关注 0票数 3

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

代码语言:javascript
复制
using System;
using System.IO;

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

在此之前,对于完整的程序,我们可以使用Main类作为“指示器”类。thisthis.GetType()是不可用的,因为技术上它在静态方法中。我现在怎么弄到?

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

代码语言:javascript
复制
var exeFolder = Path.GetDirectoryName(Assembly.GetCallingAssembly().Location);

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

EN

回答 3

Stack Overflow用户

回答已采纳

发布于 2020-12-06 06:03:40

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

代码语言:javascript
复制
TypeInfo result = MethodBase
  .GetCurrentMethod() // Executing method         (e.g. Main)
  .DeclaringType      // Type where it's declared (e.g. Program)
  .GetTypeInfo();    

如果您想要Type,而不是TypeInfo删除最后一个方法:

代码语言:javascript
复制
Type result = MethodBase
  .GetCurrentMethod() // Executing method         (e.g. Main)
  .DeclaringType;     // Type where it's declared (e.g. Program)
票数 3
EN

Stack Overflow用户

发布于 2020-12-06 05:01:32

还可以使用GetEntryAssembly获取程序集。

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

代码语言:javascript
复制
Console.WriteLine(Assembly.GetEntryAssembly().EntryPoint.DeclaringType);

即使您不在顶层,上面的代码也会得到编译器生成的"Program“类。

票数 5
EN

Stack Overflow用户

发布于 2022-01-09 21:48:00

对于C# 10 (见第4点的突破变化)编译器为顶级语句生成Program类,以便您可以使用它:

代码语言:javascript
复制
Console.WriteLine(typeof(Program).FullName);

虽然原始(C# 9) 文档声明:

请注意,名称"Program“和"Main”仅用于说明目的,编译器使用的实际名称与实现无关,无论是类型还是方法都不能由源代码中的名称引用。

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

票数 4
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/65164165

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档