假设我有一个用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)