2009-11-03 18 views

Respuesta

6

Se pueden utilizar expresiones para lograr esto con bastante facilidad. Vea esto blog for a sample.

Esto hace que sea para que pueda crear una expresión a través de un lambda, y extraiga el nombre. Por ejemplo, la aplicación de INotifyPropertyChanged puede ser revisado a fin de hacer algo como:

public int MyProperty { 
    get { return myProperty; } 
    set 
    { 
     myProperty = value; 
     RaisePropertyChanged(() => MyProperty); 
    } 
} 

Con el fin de asignar su equivalente, utilizando la clase referenciada "Reflect", que harías algo así como:

string propertyName = Reflect.GetProperty(() => SomeProperty).Name; 

Viola - nombres de propiedades sin cadenas mágicas.

+0

La sintaxis aquí es un poco desagradable, pero hace lo que yo necesitaba. ¡Gracias! –

1

Puede obtener una lista de propiedades de un objeto utilizando la reflexión.

MyClass o; 

PropertyInfo[] properties = o.GetType().GetProperties(
    BindingFlags.NonPublic | BindingFlags.Public | BindingFlags.Instance 
); 

Cada propiedad tiene un atributo de nombre que conseguir que "SomeProperty"

8

Este enfoque será mucho más rápido que utilizando Expression

public static string GetName<T>(this T item) where T : class 
{ 
    if (item == null) 
     return string.Empty; 

    return typeof(T).GetProperties()[0].Name; 
} 

Ahora se le puede llamar:

new { MyClass.SomeProperty }.GetName(); 

puede almacenar en caché los valores si necesita aún más el rendimiento. Ver esta pregunta duplicada How do you get a variable's name as it was physically typed in its declaration?

+0

La mejor respuesta aquí. No quiero propiedades de ciclo, quiero obtener un nombre de propiedad basado en una propiedad real. Usar el tipo anónimo con la primera (única) propiedad de la que desea el nombre es genio. – Paul

+0

@Paul No soy el genio detrás de esto. En segundo lugar, no es muy refactorio. Me refiero a si cambias el nombre de la propiedad, el tipo anónimo conserva el nombre original. En este caso, si cambia 'SomeProperty' por' SomeProperty1', la clase anónima cambia a 'new {SomeProperty = SomeProperty1}', que imprimirá "SomeProperty", en lugar del nombre actualizado "SomeProperty1". Lo mencionaré en la respuesta. – nawfal

+0

Darn. No anticipo cambiar alguna vez el nombre de una propiedad, pero si alguna vez lo hice, me gustaría que la refactorización lo maneje. Gracias por hacérmelo saber. – Paul

Cuestiones relacionadas