2010-12-06 15 views
8

Digamos que tenemos una propiedad de la siguiente manera¿Cómo obtener el nombre de propiedad dentro de getter/setter de esa propiedad?

public string SomeProperty 
{ 
    get 
    { 
     var propName = "SomeProperty"; 
     return "<" + propName + ">"; 
    } 
} 

¿Cómo se ajusta el valor de la variable anterior propName ser el nombre de la propiedad mediante la lectura de la información de ensamblado en sí?

Editar

Por qué necesitamos esto?

Estoy usando el WPF d:DataContext como se menciona en here que me ayudará a mostrar un valor de 'modo de diseño' para las propiedades enlazadas - muy a menudo, los valores encuadernados se muestran como cadena vacía en modo de diseño. Y en la clase de contexto de datos de 'modo de diseño', quiero devolver el nombre de la propiedad para cada propiedad de enlace que pueda tener.

Espero que esto explique sus preocupaciones.

+1

Por favor, aclarar dónde te gustaría hacer ese. –

+0

y por qué estás haciendo esto? ¿hay algún requisito específico – TalentTuner

+1

por lo que desea hacer una propiedad, que devuelve su propio nombre? –

Respuesta

10

Después de un tiempo de encontrar una solución de la siguiente manera, lo que es muy conveniente para mí.

string SomeProperty 
    { 
     get 
     { 
      return GetDesignModeValue(() => this.SomeProperty); 
     } 
    } 

    string GetDesignModeValue<T>(Expression<Func<T>> propertyExpression) 
    { 
     var propName = (propertyExpression.Body as MemberExpression).Member.Name; 
     var value = string.Format(
      "<{0}>" 
      , propName); 
     return value; 
    } 

Así que, de ahora en adelante, es mucho más fácil para nosotros para mostrar mocking valor de las propiedades de unión en modo de diseño.

¡Espero que lo encuentres útil algunos días!

+0

10x, funciona perfectamente. – mynkow

+1

Al usar Visual Studio 2015, simplemente puede usar la palabra clave del operador [nameof (this.SomeProperty)] (https://msdn.microsoft.com/en-us/library/dn986596.aspx) –

4

No hay una manera confiable de hacerlo en tiempo de ejecución, pero puede usar MethodBase.GetCurrentMethod().Name y tirar los primeros cuatro caracteres.

Este enfoque tiene algunas fallas: ejecutar el binario a través de una herramienta de ofuscación puede hacer que el método se renombre. Además, el método puede estar en línea y causar problemas (si solo usa Remove en la cadena sin verificar la longitud, puede incluso causar bloqueos inesperados en la compilación Release que pueden ser difíciles de reproducir en modo Debug).

Si su código sigue un patrón y necesita generar un montón de propiedades como esa, es mejor utilizar un enfoque en tiempo de compilación como un generador de código o un marco de programación orientado a aspectos.

1

esto también debería funcionar, pero no estoy seguro de por qué necesita este

public string SomeProperty 
    { 
     get 
     { 
      StackTrace st = new StackTrace(); 
      StackFrame[] fr = st.GetFrames(); 
      if (fr != null) 
      { 
       var propName = fr[0].GetMethod().Name.Substring(3, fr[0].GetMethod().Name.Length); 
       return "<" + propName + ">"; 
      } 

      return "SomeProperty"; 

     } 
    } 
+0

He actualizado mi pregunta para explicar por qué la necesito. Gracias Saurabh –

+0

Esto funcionó para mí, aunque utilicé 'Name.Substring (4)' ya que están prefijados con 'set_' o' get_' - y no necesitas el segundo parámetro – Ant

-3

Es posible pasar el nombre de la propiedad al comprador.

si MyObj es el objeto y si PROPNAME es la variable que contiene el nombre de la propiedad, entonces el siguiente código está haciendo el trabajo:

eval("Object.defineProperty(MyObj, PropName, { " + 
    "get : function() { return(\"the prop name is " + PropName + "\"); } });"); 
+1

Esto no se ve como C# ... –

Cuestiones relacionadas