GetPropertyName, recuperar el nombre de una propiedad

GetPropertyName, recuperar el nombre de una propiedad
GetPropertyName

Hola chicos! Hoy vamos a ver cómo conseguir el nombre de una propiedad de la manera más sencilla posible. Gabi y yo, estábamos viendo las novedades de Windows 10, y al ver el operador nameof, nos entro las ganas de tenerlo también en proyectos que aún no estuvieran en Win10. Así que nos pusimos manos a la obra y desarrollamos una pequeña extensión que nos sirve para lo mismo.

Cuando y para que me sirve?

Esta extensión la puedes utilizar en proyectos anteriores a Windows 10, y comúnmente se utiliza para la notificación de las propiedades al implementarlo en MVVM o para la identificación de las mismas en la validación de los errores (IDataErrorInfo).

Preparamos el proyecto

Primero, debemos ser conscientes que tendremos que implementar el modelo MVVM de acuerdo a estos siguientes tutoriales. Una vez implementada, podemos ver que tenemos una clase ViewModelBase que lo implementan cada ViewModel de nuestro proyecto.

Y ahora implementamos la Extensión

Ahora, si queremos podemos crear una carpeta de "Extensions" y dentro declaramos la siguiente clase estática con un método estático: public static class ViewModelExtensions { /// <summary> /// Accepts a lambda expression selecting an object property /// and returns the property name as string. /// </summary> /// <typeparam name="TSource">Source class</typeparam> /// <param name="vm"></param> /// <param name="expression">A lambda expression (something like x => x.Name)</param> /// <returns>The property's name as string.</returns> public static string GetPropertyName<TSource>(this TSource vm, Expression<Func<TSource, object>> expression) where TSource : ViewModelBase { var lambda = expression as LambdaExpression; MemberExpression memberExpression; if (lambda.Body is UnaryExpression) { var unaryExpression = lambda.Body as UnaryExpression; memberExpression = unaryExpression.Operand as MemberExpression; } else { memberExpression = lambda.Body as MemberExpression; } if (memberExpression != null) { var propertyInfo = memberExpression.Member as PropertyInfo; return propertyInfo.Name; } return null; } } Podemos ver que GetPropertyName está apto para pasar una expresión lambda con nuestro propiedad y devolver un string. Dentro del método, lo que se hace es que del lambda, sacamos la propiedad como MemberExpression y hacemos un casting como PropertyInfo donde por su propiedad Name podemos sacar el nombre de dicha propiedad. Un punto a tener en cuenta, es que TSource la estamos por defecto inicializando como ViewModelBasewhere TSource : ViewModelBase Gracias a esta línea, podemos tener esta extensión en nuestras ViewModels que han heredado la clase ViewModelBase. Teniendo una propiedad Name, podemos sacar su nombre mediante this.GetPropertyName(x => x.Name);public class MainViewModel : ViewModelBase { public MainViewModel() { var property = this.GetPropertyName(x => x.Name); } private string name; public string Name { get { return name; } set { if (name != value) { name = value; OnPropertyChanged(); } } } }

Beneficio al utilizarlo

El beneficio al utilizarlo es simple, ya que quitamos los famosos "Magic strings" de nuestro código. Ya no tendremos que preocuparnos si cambiamos la propiedad de nombre, si en algún lugar se ha pasado como "string" literalmente.

Be a geek

Y si aún no estás satisfecho de la simplicidad para aplicar este método en nuestras ViewModels, te dejamos un snippet que acelera aún más el proceso. Un regalo geek para gente geek ;) Te dejamos nuestro nameof para proyectos anteriores a Windows 10. <!-- CTRL+K, CTRL+X = Insert Snippet --> <!-- CTRL+K, CTRL+B = Manage Snippets --> <CodeSnippet Format="1.0.0" xmlns="http://schemas.microsoft.com/VisualStudio/2005/CodeSnippet"> <Header> <Title>Get property name as string</Title> <Author>Gabriel Ferreiro</Author> <Shortcut>nameof</Shortcut> <Description>Get property name as string</Description> <SnippetTypes> <SnippetType>Expansion</SnippetType> </SnippetTypes> </Header> <Snippet> <Declarations> <Literal> <ID>name</ID> <Default>MyProperty</Default> </Literal> </Declarations> <Code Language="CSharp"> <![CDATA[this.GetPropertyName(x => x.$name$);]]> </Code> </Snippet> </CodeSnippet> Lo metes, en ..Code Snippets\Visual C#\My Code Snippets de la carpeta Visual Studioy a disfrutar! Hasta aquí llega otro tutorial. Si os ha gustado no os lo quedéis para vosotros, compartid 😉 Happy Coding!