una tag obtener nombre clase c# .net reflection

tag - obtener el nombre de una clase c#



Usar System.Reflection para obtener el nombre completo de un método (8)

Tengo una clase que se parece a lo siguiente:

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

El valor de myName es "MyMethod".

¿Hay alguna manera de que pueda usar Reflection para obtener un valor de "MyClass.MyMethod" para myName en myName lugar?


Creo que en estos días, lo mejor es hacer esto:

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


En C # 6 puedes usar nameof :

string myName = nameof(MyMethod);


Extendiendo Ruben''s, puedes obtener el nombre completo así:

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

Puede agregarlo a un método estático que reciba un parámetro MethodBase y genere la cadena.


Gracias por las publicaciones anteriores, me ayudaron a crear un fuerte sistema de enlace de tipos para MVC 4 HTMLHelpers de la siguiente manera.

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

Para usar el código de arriba en cualquier vista CSHTML:

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

Esto me permite vincular cualquier propiedad en un ViewModel con cualquier tipo de elemento HTML que desee. En el ejemplo anterior, anoto el campo de nombre de los datos seleccionados publicados después de que el usuario hace la selección. El modelo de vista después de la publicación posterior muestra automáticamente el valor seleccionado.


Podrías mirar el ReflectedType del MethodBase que obtienes de GetCurrentMethod , es decir,

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


Puedes obtener el nombre completo así:

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


Tendrá problemas al ejecutar dentro de los métodos asíncronos. A continuación, le indicamos cómo solucionarlo:

Si necesita calificar completamente el nombre de clase, tendrá que usar DeclaringType.FullName lugar de DeclaringType.Name

Este código no funcionará muy bien para métodos anónimos o lambda.

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

Aquí hay un ejemplo de uso:

class Program { static void Main(string[] args) { // outputs Program.Main Console.WriteLine(GetMethodContextName()); } }


Y para obtener el nombre completo del método con parámetros:

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()));