Использование System.Reflection для получения полного имени метода - PullRequest
39 голосов
/ 03 июня 2010

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

public class MyClass
{

...

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

...

}

Значение myName равно «MyMethod».

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

Ответы [ 8 ]

62 голосов
/ 03 июня 2010

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

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

string fullMethodName = className + "." + methodName;
20 голосов
/ 09 ноября 2013

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

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()));
6 голосов
/ 21 января 2017

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

string fullMethodName = $"{typeof(MyClass).FullName}.{nameof(MyMethod)}";
6 голосов
/ 27 декабря 2011

Расширяя Рубена, вы можете получить полное имя, например:

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

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

4 голосов
/ 09 марта 2016

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

string myName = nameof(MyMethod);
4 голосов
/ 10 июля 2013

Вы можете получить полное имя следующим образом:

var fullMethodName = System.Reflection.MethodBase.GetCurrentMethod().ReflectedType.FullName;
2 голосов
/ 01 декабря 2014

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

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

0 голосов
/ 13 февраля 2018

У вас будут проблемы при запуске внутри асинхронных методов. Вот как это исправить:

Если вам нужно полностью указать имя класса, вам придется использовать DeclaringType.FullName вместо DeclaringType.Name

Этот код не будет хорошо работать для анонимных или лямбда-методов.

static string GetMethodContextName() {
    var name = new StackTrace().GetFrame(1).GetMethod().GetMethodContextName();
}

static string GetMethodContextName(this MethodBase method) {
    if (method.DeclaringType.GetInterfaces().Any(i => i == typeof(IAsyncStateMachine))) {
        var generatedType = method.DeclaringType;
        var originalType = generatedType.DeclaringType;
        var foundMethod = originalType.GetMethods(Instance | Static | Public | NonPublic | DeclaredOnly)
            .Single(m => m.GetCustomAttribute<AsyncStateMachineAttribute>()?.StateMachineType == generatedType);
        return foundMethod.DeclaringType.Name + "." + foundMethod.Name;
    } else {
        return method.DeclaringType.Name + "." + method.Name;
    }
}

Вот пример использования:

class Program { 
    static void Main(string[] args) {
        // outputs Program.Main
        Console.WriteLine(GetMethodContextName());
    }
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...