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;
}
}