如果我实现了默认的async / await方法,如:
class Program
{
static void Main(string[] args)
{
new Program().TestMethod();
}
private async void TestMethod()
{
await Task.Delay(10);
}
}
生成的IL-Code和异步状态机包含一个字段" this"引用调用该方法的实例。如果代码被调整为静态代码,那么当然没有"这个"值。
不要通过反射来做到这一点,更多的是从CLR或调试器的角度来看。 有谁知道我如何在"静态TestMethod"从哪个方法调用 - 在IL级别上!
class Program
{
static void Main(string[] args)
{
TestMethod();
}
private static async void TestMethod()
{
await Task.Delay(10);
}
}
答案 0 :(得分:3)
我如何确定"静态TestMethod"从哪个方法叫做
您可以使用CallerMemberName
属性
static void Main(string[] args)
{
new Program().TestMethod();
Console.ReadLine();
}
private async void TestMethod([CallerMemberName]string caller = "")
{
Console.WriteLine(caller);
}
PS:您还可以使用CallerFilePath
或CallerLineNumber
答案 1 :(得分:0)
using System;
using System.Diagnostics;
namespace Cli
{
class Program
{
static void Main(string[] args)
{
new Program().TestMethod();
}
private void TestMethod()
{
var sf = new StackFrame(1); //get caller stackframe
var mi = sf.GetMethod(); //get method info of caller
Console.WriteLine("{0}::{1}", mi.DeclaringType, mi.Name);
// Cli.Program::Main
}
}
}