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

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

    }
}
如何在方法执行时返回完全限定名称?

你使用的是哪个版本的C#?C# 5使这更简单。 - Jon Skeet
2个回答

15

没有任何硬编码?像这样的东西,也许?

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

static string GetMemberName([CallerMemberName] string memberName = "")
{
    return memberName;
}

或者更漂亮一些:

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

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

(我使用了 static,因为我假设在实际代码中,你希望将该方法放在某个实用类中)


抱歉。[CallerMemberName] string memberName = ""是什么?它似乎是一个新功能。 - kiss my armpit
1
@ガベージコレクタ 是的,这是C# 5的一个新功能;请参阅MSDN - Marc Gravell
2
@MarcGravell,我希望有一个[CallerType]属性或者至少类似[CallerFullName]的东西,因为这可能在编译时不容易实现。 - Evgeniy Berezovsky
@EugeneBeresovksy 我怀疑之所以没有这个功能是因为它不能解决同一类型的问题:thisthis.GetType()typeof(TheClass)都存在,而且没有一个像在调用点中编写“SomeMethodName”那样遇到问题。 - Marc Gravell
2
除非调用者显式提供“this”,否则[Caller*]属性会自动添加信息,而不需要调用者做任何事情。但是在类型的情况下,它肯定比执行new StackFrame(1)来确定方法名称要好得多...@MarcGravell - Evgeniy Berezovsky

7
如果您使用的是C# 5,可以更简单地完成此操作,但这也是可行的:
var method = MethodBase.GetCurrentMethod();
var type = method.DeclaringType;
var fullName = string.Format("{0}.{1}", type.FullName, method.Name);

假设该方法没有被覆盖,那么就可以这样做。当然,不幸的是你不能将其放入实用方法中,否则当前方法就成了实用方法。
你可以使用 StackTrace 来解决这个问题,但需要注意内联 - 如果你创建一个实用方法,然后从一个被内联的方法中调用它,你会得到想要的方法的调用者

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接