Как вернуть метод полностью квалифицированного имени на лету?
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
, чтобы обойти это, но вам нужно быть осторожным при встраивании - если вы создадите полезный метод, а затем вызовите его из метода, который сам встроен, вы получите вызывающего метода, который вы хотите: (