temperamento precio negro irlandes inglés ingles gordon c# .net reflection properties

c# - precio - Obtener el nombre de la propiedad dentro del setter



setter irlandes (6)

Deberías usar la propiedad ViewState de tu control:

public int MyIndex { get { object index = ViewState["MyIndex"]; return (null == index) ? -1 : (int)index; } set { ViewState["MyIndex"] = value; } }

Quiero preservar una propiedad entre las devoluciones de datos en una aplicación ASP.Net. Actualmente haciendo esto:

public int MyIndex { get { return (int)Session[ToString() + "MyIndex"]; } }

pero preferiría algo como:

public int MyIndex { get { return (int)Session[ToString() + #code_that_returns_property_name#]; } }

Setter se omite, pero solo inserta valor en Session usando la misma cadena. ¿Hay alguna forma de utilizar la reflexión o una solución mejor diferente?


No, no hay una manera simple de hacer lo que quieres hacer. Creo que estás mucho mejor con el código que ya has escrito.

Edit: Esta respuesta ha recibido bastantes votos negativos y entiendo por qué. Si bien es posible hacer lo que el OP quiere hacer, quizás todos deberíamos detenernos y pensar si es recomendable o no hacerlo. Parafraseando las palabras inmortales del Dr. Ian Malcom , solo porque puedas hacer algo no significa que debas hacerlo.


Puede usar MethodInfo.GetCurrentMethod (). Name para devolver el nombre del método actual:

public int MyIndex { get { return (int)Session[ToString() + MethodInfo.GetCurrentMethod().Name]; } }

Dado que las propiedades se implementan como métodos bajo el capó, eso devolverá un nombre como "get_MyIndex". Si no quieres la parte "get_", puedes restar algunos caracteres:

public int MyIndex { get { return (int)Session[ToString() + MethodInfo.GetCurrentMethod().Name.Substring(4)]; } }


Puedes usar un árbol de expresiones para obtener el nombre del miembro. Es un poco de un corvejón pero funciona. Aquí está el código.

private string GetPropertyName<TValue>(Expression<Func<BindingSourceType, TValue>> propertySelector) { var memberExpression = propertySelector.Body as MemberExpression; if (memberExpression != null) { return memberExpression.Member.Name; } else { return string.empty; } }

Con ese código puedes hacer lo siguiente

return (int)Session[ToString() + GetPropertyName(MyIndex)];

Código robado despiadadamente de la respuesta de Romain en el siguiente hilo


Usar CallerMemberName es mucho más rápido y puede copiarse y pegarse fácilmente para obtener propiedades adicionales.

private static object GetSessionValue([CallerMemberName]string propertyName = "") { return Session[propertyName]; } private static void SetSessionValue(object value, [CallerMemberName]string propertyName = "") { Session[propertyName] = value; } public int MyIndex { get { return (int)GetSessionValue(); } set { SetSessionValue(value); } }


public static int Dummy { get { var propertyName = MethodBase.GetCurrentMethod().Name.Substring(4); Console.WriteLine(propertyName); return 0; } }