¿C # cómo obtener el nombre (en cadena) de una propiedad de clase?

public class TimeZone { public int Id { get; set; } public string DisplayName{ get; set; } } 

En alguna otra clase he:

  var gmtList = new SelectList( repository.GetSystemTimeZones(), "Id", "DisplayName"); 

Nota: System.Web.Mvc.SelectList

No me gusta tener que escribir el nombre de la propiedad con “Id” y “DisplayName”. Más tarde, quizás el nombre de la propiedad cambie y el comstackdor no detectará este error. C # ¿Cómo obtener el nombre de la propiedad en una cadena?

ACTUALIZACIÓN 1

Con la ayuda de Christian Hayter, puedo usar:

 var tz = new TimeZone(); var gmtList = new SelectList( repository.GetSystemTimeZones(), NameOf(() => tz.Id), NameOf(() => tz.TranslatedName)); 

O

 var gmtList = new SelectList( repository.GetSystemTimeZones(), NameOf(() => new TimeZone().Id), NameOf(() => new TimeZone().TranslatedName)); 

Si alguien tiene otra idea sin la necesidad de crear un nuevo objeto. Siéntete libre de compartirlo 🙂 gracias.

Podría crear un método de utilidad para extraer el nombre de la propiedad de un árbol de expresiones, como este:

 string NameOf(Expression> expr) { return ((MemberExpression) expr.Body).Member.Name; } 

Entonces puedes llamarlo así:

 var gmtList = new SelectList(repository.GetSystemTimeZones(), NameOf(() => tz.Id), NameOf(() => tz.DisplayName)); 

Tenga en cuenta que cualquier instancia de la clase funcionará, ya que no está leyendo el valor de la propiedad, solo el nombre.

(Esos no son parámetros por cierto, son propiedades).

Bueno, una opción es usar delegates. Por ejemplo:

 public class SelectList { public SelectList(IEnumerable source, Func idProjection, Func displayProjection) { ... } } 

Entonces:

 var gmtList = new SelectList(repository.GetSystemTimeZones(), tz => tz.Id, tz => tz.DisplayName); 

var name = (string) typeof(TimeZone).GetProperty("DisplayName").GetValue(0);

 string id=typeof(TimeZone).GetProperties()[0].Name; string displayName=typeof(TimeZone).GetProperties()[1].Name; var gmtList = new SelectList( repository.GetSystemTimeZones(), id, displayName); 

Esto funcionará, a menos que el orden en el que el ID y el nombre de visualización declarado no cambie. o de lo contrario puede pensar en definir un atributo para que la propiedad diferencie entre id y displayname.

Desde C # 6.0, ahora puedes usar

 var gmtList = new SelectList( repository.GetSystemTimeZones(), nameof(TimeZone.Id), nameof(TimeZone.DisplayName));