C# 如何返回方法';正在运行的完全限定名是什么?

C# 如何返回方法';正在运行的完全限定名是什么?,c#,C#,如何动态返回方法的完全限定名?无需任何硬编码?大概是吧 using System; using System.Collections.Generic; using System.Linq; using System.Web; using System.Web.Mvc; namespace MvcMusicStore.Controllers { public class StoreController : Controller { // // GE

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

无需任何硬编码?大概是吧

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";
        }

    }
}
或者更漂亮:

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

static string GetMemberName([CallerMemberName] string memberName = "")
{
    return memberName;
}
(我使用的是
static
,因为我假设在实际代码中,您希望将该方法放在某个实用程序类中)

如果您使用的是C#5,您可以更简单地执行此操作,但这也行得通:

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

static string GetMemberName(
    object caller, [CallerMemberName] string memberName = "")
{
    return caller.GetType().FullName + "." + memberName;
}
当然,这是假设该方法没有被重写。不幸的是,您当然不能将其放入实用方法中,否则当前方法就是实用方法


您可以使用来绕过此问题,但在内联方面需要小心-如果您创建一个实用程序方法,然后从一个本身内联的方法中调用它,您将得到所需方法的调用方:(

您使用的是哪个版本的C?C#5使这更简单。对不起,
[CallerMemberName]string memberName=“”
?这似乎是一项新功能@ガベージコレクタ 是的,这是C#5;@MarcGravel的一个新特性。我希望有一个
[CallerType]
属性,或者,因为这可能不容易在编译时(?)完成,至少像
[CallerFullName]这样的属性
@EugeneBeresovksy我怀疑之所以没有,是因为它没有解决同一类型的问题:
this
this.GetType()
typeof(类)
都存在,而且没有一个问题与必须编写
SomeMethodName的问题完全相同
进入调用站点。@marcGravel除了调用方必须显式地提供
这个
,而
[caller*]
属性在调用方不必做任何事情的情况下添加信息。但是对于这种类型,它肯定比必须做
新StackFrame(1)
来确定方法名称要好。。。
var method = MethodBase.GetCurrentMethod();
var type = method.DeclaringType;
var fullName = string.Format("{0}.{1}", type.FullName, method.Name);