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代码正在运行的位置。
您还可以使用 来获取程序集GetEntryAssembly。
一旦你有了代码所在的程序集,你就可以获得它的EntryPoint,这是编译器生成的“ Main”方法。然后你可以DeclaringType做得到Type:
Console.WriteLine(Assembly.GetEntryAssembly().EntryPoint.DeclaringType);
Run Code Online (Sandbox Code Playgroud)
Program即使您不在顶层,上面的内容也应该获得编译器生成的“ ”类。
对于 C# 10(请参阅重大更改中的第四点),编译器会Program为顶级语句生成类,以便您可以使用它:
Console.WriteLine(typeof(Program).FullName);
Run Code Online (Sandbox Code Playgroud)
尽管原始 (C# 9)文档指出:
请注意,名称“Program”和“Main”仅用于说明目的,编译器使用的实际名称取决于实现,并且类型和方法都不能通过源代码中的名称引用。
ASP.NET Core集成测试文档依赖于该类的命名约定。
我建议从正在执行的方法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)
| 归档时间: |
|
| 查看次数: |
643 次 |
| 最近记录: |