Подтвердить что ты не робот

Использование System.Reflection для получения полного имени метода

У меня есть класс, который выглядит следующим образом:

public class MyClass
{

...

    protected void MyMethod()
    {
    ...
    string myName = System.Reflection.MethodBase.GetCurrentMethod.Name;
    ...
    }

...

}

Значение myName - это "MyMethod".

Есть ли способ, которым я могу использовать Reflection для получения значения "MyClass.MyMethod" вместо myName?

4b9b3361

Ответ 1

Вы можете посмотреть ReflectedType MethodBase, который вы получаете от GetCurrentMethod, т.е.

MethodBase method = System.Reflection.MethodBase.GetCurrentMethod();
string methodName = method.Name;
string className = method.ReflectedType.Name;

string fullMethodName = className + "." + methodName;

Ответ 2

И чтобы получить полное имя метода с параметрами:

var method = System.Reflection.MethodBase.GetCurrentMethod();
var fullName = string.Format("{0}.{1}({2})", method.ReflectedType.FullName, method.Name, string.Join(",", method.GetParameters().Select(o => string.Format("{0} {1}", o.ParameterType, o.Name)).ToArray()));

Ответ 3

Расширение Ruben's, вы можете получить полное имя следующим образом:

var info = System.Reflection.MethodBase.GetCurrentMethod();
var result = string.Format(
                 "{0}.{1}.{2}()",
                 info.ReflectedType.Namespace,
                 info.ReflectedType.Name,
                 info.Name);

Вы можете добавить его к статическому методу, который получает параметр MethodBase и генерирует строку.

Ответ 4

Вы можете получить полное имя:

var fullMethodName = System.Reflection.MethodBase.GetCurrentMethod().ReflectedType.FullName;

Ответ 5

Думаю, в эти дни лучше всего это сделать:

string fullMethodName = $"{typeof(MyClass).FullName}.{nameof(MyMethod)}";

Ответ 6

Спасибо за вышеприведенные сообщения, они помогли мне создать сильную систему привязки типов для HTML файлов MVC 4 следующим образом.

 public static MvcHtmlString StrongTypeBinder(this HtmlHelper htmlhelper, Expression<Func<object, string>> SomeLambda)
    {
        var body = SomeLambda.Body;
        var propertyName = ((PropertyInfo)((MemberExpression)body).Member).Name;
        HtmlString = @"
            <input type='text' name='@Id' id='@Id'/>
            ";
        HtmlString = HtmlString.Replace("@Id", propertyName);
        var finalstring = new MvcHtmlString(HtmlString);
        return finalstring;

    }

Чтобы использовать код выше в любом представлении CSHTML:

@Html.StrongTypeBinder(p=>Model.SelectedDate)

Это позволяет мне связать любое свойство в ViewModel с любым типом элемента HTML, который я хочу. В приведенном выше примере я привязываю поле имени для выбранных данных, отправленных после того, как пользователь делает выбор. Модель просмотра после обратной записи автоматически отображает выбранное значение.

Ответ 7

В С# 6 вы можете использовать nameof:

string myName = nameof(MyMethod);