Использование System.Reflection для получения полного имени метода
У меня есть класс, который выглядит следующим образом:
public class MyClass
{
...
protected void MyMethod()
{
...
string myName = System.Reflection.MethodBase.GetCurrentMethod.Name;
...
}
...
}
Значение myName
- это "MyMethod".
Есть ли способ, которым я могу использовать Reflection для получения значения "MyClass.MyMethod" вместо myName
?
Ответы
Ответ 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);