property name c# reflection propertyinfo

get property name c#



Obtener el nombre de la cadena de la propiedad usando la reflexión (7)

Con C # 6.0 (Visual Studio 2015), ahora puede usar el operador nameof , así:

var obj = new MyObject(); string propertyName = nameof(obj.Property); string methodName = nameof(obj.Method); string directPropertyName = nameof(MyObject.Property); string directMethodName = nameof(MyObject.Method);

Hay una gran cantidad de ejemplos de reflexión que le permiten obtener:

    1. Todas las propiedades en una clase

    2. Una sola propiedad, siempre que conozca el nombre de la cadena

¿Hay alguna forma (utilizando reflexión, TypeDescriptor u otro) para obtener el nombre de cadena de una propiedad en una clase en tiempo de ejecución, siempre que todo lo que tengo es una instancia de la clase y la propiedad?

EDITAR Sé que puedo obtener fácilmente todas las propiedades en una clase usando reflexión y luego obtener el nombre de cada propiedad. Lo que estoy pidiendo es una función para darme el nombre de una propiedad, siempre que le pase la instancia de la propiedad. En otras palabras, ¿cómo puedo encontrar la propiedad que quiero de la matriz PropertyInfo [] devuelta desde la clase.GetType (). GetProperty (myProperty) para que pueda obtener PropertyInfo.Name de ella?


En caso de que alguien lo necesite ... aquí está la versión VB .NET de la respuesta:

Public Shared Function GetPropertyName(Of t)(ByVal PropertyExp As Expression(Of Func(Of t))) As String Return TryCast(PropertyExp.Body, MemberExpression).Member.Name End Function

Uso:

Dim name As String = GetPropertyName(Function() (New myObject).AProperty)


Usé la versión proporcionada por Jacob, pero a veces daba una excepción. Fue porque el elenco no era válido. Esta versión resolvió el problema:

public static string GetPropertyName<T>(this Expression<Func<T>> propertyExpression) { ConstantExpression cExpr = propertyExpression.Body as ConstantExpression; MemberExpression mExpr = propertyExpression.Body as MemberExpression; if (cExpr != null) return cExpr.Value.ToString(); else if (mExpr != null) return mExpr.Member.Name; else return null; }


acutully la respuesta correcta que está escrita por TKTS, y aquí solo quiero convertir su sintaxis a C #

public static string GetPropertyName<t>(Expression<Func<t>> PropertyExp) { return (PropertyExp.Body as MemberExpression).Member.Name; }

y el uso de este código es como el siguiente ejemplo:

string name = GetPropertyName(() => (new Tasks()).Title);

Además: existe la excepción de que cuando viene con todas las propiedades tiene valores nulos, entonces cualquiera tiene que tomar esto en cuenta cuando implementa su código

Gracias TKTS ..



myClassInstance.GetType().GetProperties() le da instancias PropertyInfo para todas las propiedades públicas para el tipo de myClassInstance . (Consulte MSDN para obtener documentación y otras sobrecargas). ''PropertyInfo.Name'' es el nombre real de la propiedad. En caso de que ya conozca el nombre de la propiedad, use GetProperty(name) para recuperar su objeto PropertyInfo (vea MSDN nuevamente).


Si ya tiene un PropertyInfo , entonces la respuesta de @dtb es la correcta. Sin embargo, si quiere saber en qué código de propiedad se encuentra actualmente, deberá atravesar la pila de llamadas actual para averiguar qué método está ejecutando actualmente y derivar el nombre de la propiedad desde allí.

var stackTrace = new StackTrace(); var frames = stackTrace.GetFrames(); var thisFrame = frames[0]; var method = thisFrame.GetMethod(); var methodName = method.Name; // Should be get_* or set_* var propertyName = method.Name.Substring(4);

Editar:

Después de su aclaración, me pregunto si lo que quiere hacer es obtener el nombre de una propiedad de una expresión de propiedad. Si es así, es posible que desee escribir un método como este:

public static string GetPropertyName<T>(Expression<Func<T>> propertyExpression) { return (propertyExpression.Body as MemberExpression).Member.Name; }

Para usarlo, escribirías algo como esto:

var propertyName = GetPropertyName( () => myObject.AProperty); // returns "AProperty"