gpt4 book ai didi

c# - 使用 yield return 时如何获取属性名

转载 作者:太空狗 更新时间:2023-10-29 21:10:03 27 4
gpt4 key购买 nike

如何获取正在执行的属性的属性名称。如果该属性使用“return”,则MethodBase.GetCurrentMethod().Name 返回属性的名称。但是当我使用“yield return”时,MethodBase.GetCurrentMethod().Name 返回“MoveNext”。使用 yield return 时如何获取执行属性名?

示例代码

    class Program
{
static void Main(string[] args)
{

var x = myProgram.Something;

Console.ReadLine();
}
}

public class myProgram
{
public static IEnumerable<string> Something
{
get
{
string var = MethodBase.GetCurrentMethod().Name;
for (int i = 0; i < 5; i++)
{
yield return var;
}
}
}
}

最佳答案

您可能已经注意到,编译器重新组织了方法的工作方式,并且 Something 返回了一个实现了 IEnumerable 的私有(private)类。 .因此,您的方法的实际内容出现在 MoveNext 中。这个私有(private)类的方法,所以MethodBase.GetCurrentMethod不返回看起来应该返回的内容。

碰巧私有(private)类的名字是从原来的方法名派生出来的,在本例中是<Enumerate>d__0 .因此,您可以从堆栈帧中解析原始方法名称。

static IEnumerable<string> Enumerate()
{
var method = new StackTrace(true).GetFrame(0).GetMethod().DeclaringType.Name;
yield return Regex.Replace(method, @".*<([^)]+)>.*", "$1");
}

static void Main(string[] args)
{
foreach (var @string in Enumerate())
{
Console.WriteLine(@string);
}
}

当然,这是一种 hack,很容易在未来的 .NET 版本中不起作用

关于c# - 使用 yield return 时如何获取属性名,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/9551780/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com