Как вернуть метод полностью квалифицированного имени на лету?

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

    }
}

Как вернуть метод полностью квалифицированного имени на лету?

Ответ 1

Без жесткого кодирования? Что-то вроде может быть?

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, потому что я предполагаю, что в реальном коде вы хотите поместить этот метод в какой-нибудь полезный класс)

Ответ 2

Если вы используете С# 5, вы можете сделать это несколько проще, но это тоже работает:

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

Это предполагает, что метод не переопределен, конечно. К сожалению, вы не можете поместить это в полезный метод, так как в противном случае текущий метод - это метод утилиты.

Вы можете использовать StackTrace, чтобы обойти это, но вам нужно быть осторожным при встраивании - если вы создадите полезный метод, а затем вызовите его из метода, который сам встроен, вы получите вызывающего метода, который вы хотите: (