如何动态返回方法的完全限定名称?

kis*_*pit 13 c#

using System;
using System.Collections.Generic;
using System.Linq;
using System.Web;
using System.Web.Mvc;

namespace MvcMusicStore.Controllers
{
    public class StoreController : Controller
    {
        //
        // GET: /Store/

        public string Index()
        {
            return "MvcMusicsStore.Controllers.StoreController.Index";
        }

    }
}
Run Code Online (Sandbox Code Playgroud)

如何动态返回方法的完全限定名称?

Mar*_*ell 11

没有任何硬编码?可能还有什么?

public string Index()
{
    return GetType().FullName + GetMemberName();
}

static string GetMemberName([CallerMemberName] string memberName = "")
{
    return memberName;
}
Run Code Online (Sandbox Code Playgroud)

或者更漂亮:

public string Index()
{
    return GetMemberName(this);
}

static string GetMemberName(
    object caller, [CallerMemberName] string memberName = "")
{
    return caller.GetType().FullName + "." + memberName;
}
Run Code Online (Sandbox Code Playgroud)

(我static之所以使用,是因为我假设在实际代码中你想将方法放在某个实用程序类中)

  • @MarcGravell我希望有一个[[CallerType]`属性,或者,因为可能不太容易进行编译时(?),至少希望有一个类似[[CallerFullName]`之类的东西。 (2认同)
  • @MarcGravell除了调用者必须显式提供this之外,而[Caller *]属性将添加信息,而调用者不必执行任何操作。但是在这种类型的情况下,绝对比必须执行`new StackFrame(1)`来找出方法名称要好... (2认同)

Jon*_*eet 6

如果你正在使用C#5,你可以稍微简单地做到这一点,但这也有效:

var method = MethodBase.GetCurrentMethod();
var type = method.DeclaringType;
var fullName = string.Format("{0}.{1}", type.FullName, method.Name);
Run Code Online (Sandbox Code Playgroud)

当然,这是假设方法没有被覆盖.不幸的是,当然不能把它放到实用方法中,否则当前的方法就是实用方法.

你可以StackTrace用来绕过这个,但你需要小心内联 - 如果你创建一个实用工具方法,然后从一个本身内联的方法中调用它,你将得到你想要的方法的调用者 :(