C# 如何将方法名作为参数传递给函数?

C# 如何将方法名作为参数传递给函数?,c#,.net,reflection,C#,.net,Reflection,我在这里发现了一个类似的问题 但这个问题的答案也给出了和我在第一个例子中提到的相同的结果 这是我正在使用的方法 public class iStore { public T GetSiteCacheValueByFunc<T>(Func<T> func) where T : class { var methodName = func.Method.Name; } } 如果我使用下面的

我在这里发现了一个类似的问题 但这个问题的答案也给出了和我在第一个例子中提到的相同的结果

这是我正在使用的方法

public class iStore
    {
        public T GetSiteCacheValueByFunc<T>(Func<T> func) where T : class
        {
            var methodName = func.Method.Name;
        }
    }
如果我使用下面的代码,我会得到正确的methodName
GetAllLanguages
,但这样我就无法将参数传递给GetAllLanguages方法

public ActionResult Index()
{
    var site = BusinessLogic.Caching.iStore;
    var languages = site.GetSiteCacheValueByFunc<IEnumerable<Language>>(LanguageManager.GetAllLanguages);
}
public ActionResult Index()
{
var site=BusinessLogic.Caching.iStore;
var languages=site.GetSiteCacheValueByFunc(LanguageManager.GetAllLanguages);
}

我哪里做错了?如何获得正确的methodName?

如果您使用的是.NET 4.5,则可以使用以下属性:


在第二个示例中,您传入了一个匿名函数,因此像
b_2
这样的名称并不奇怪。但是为什么您首先需要方法名称?我想筛选特定的方法代码不应根据调用它的人更改其行为。@MujassirNasir如果您以错误的方式解决此问题,我建议您再问一个问题,如何最好地解决您的原始问题,而不是这个问题。谢谢,如果你对此很在行,你能帮助我如何用这个实现修改上面的代码吗?我认为这在这里没有用处
CallerMemberName
使编译器插入调用
MyMethod
的函数/属性的名称,而不是要传入的函数的名称。所以在Mujassirs的最后一个例子中,您将得到“Index”而不是“GetAllLanguages”。
public ActionResult Index()
{
    var site = BusinessLogic.Caching.iStore;
    var languages = site.GetSiteCacheValueByFunc<IEnumerable<Language>>(LanguageManager.GetAllLanguages);
}
public void MyMethod([CallerMemberName]string myCallerName = null)
{
  //use myCallerName
}