gpt4 book ai didi

c# - 检索在 Func 中执行的调用方法的名称

转载 作者:行者123 更新时间:2023-11-30 19:14:13 24 4
gpt4 key购买 nike

我想获取被委托(delegate)为 Func 的方法的名称。

Func<MyObject, object> func = x => x.DoSomeMethod();
string name = ExtractMethodName(func); // should equal "DoSomeMethod"

我怎样才能做到这一点?

-- 吹牛的权利 --

ExtractMethodName 也可以使用属性调用,让它返回该实例中的属性名称。

例如。

Func<MyObject, object> func = x => x.Property;
string name = ExtractMethodName(func); // should equal "Property"

最佳答案

看妈妈!没有表达式树!

这是一个快速、肮脏且特定于实现的版本,它从底层 lambda 的 IL 流中获取元数据 token 并解析它。

private static string ExtractMethodName(Func<MyObject, object> func)
{
var il = func.Method.GetMethodBody().GetILAsByteArray();

// first byte is ldarg.0
// second byte is callvirt
// next four bytes are the MethodDef token
var mdToken = (il[5] << 24) | (il[4] << 16) | (il[3] << 8) | il[2];
var innerMethod = func.Method.Module.ResolveMethod(mdToken);

// Check to see if this is a property getter and grab property if it is...
if (innerMethod.IsSpecialName && innerMethod.Name.StartsWith("get_"))
{
var prop = (from p in innerMethod.DeclaringType.GetProperties()
where p.GetGetMethod() == innerMethod
select p).FirstOrDefault();
if (prop != null)
return prop.Name;
}

return innerMethod.Name;
}

关于c# - 检索在 Func 中执行的调用方法的名称,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/1225642/

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