Récupère le nom de la propriété dans le setter

Je souhaite conserver une propriété entre des publications dans une application ASP.Net. Actuellement en train de faire ceci:

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

mais préférerait quelque chose comme:

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

Setter omis, mais il insère simplement la valeur dans Session en utilisant la même chaîne. Existe-t-il un moyen d’utiliser la reflection ou une autre solution meilleure?

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

Non, il n’y a pas de moyen simple de faire ce que vous voulez faire. Je pense que vous êtes beaucoup mieux avec le code que vous avez déjà écrit.

Edit: Cette réponse a reçu pas mal de votes négatifs et je comprends pourquoi. Bien qu’il soit possible de faire ce que le PO veut faire, peut-être devrions-nous tous nous arrêter et réfléchir à l’opportunité de le faire ou non. Pour paraphraser les mots immortels du Dr Ian Malcom , ce n’est pas parce que vous pouvez faire quelque chose que vous devriez le faire.

L’utilisation de CallerMemberName est beaucoup plus rapide et peut être facilement copiée et collée pour obtenir des propriétés supplémentaires.

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

Vous pouvez utiliser MethodInfo.GetCurrentMethod (). Name pour renvoyer le nom de la méthode en cours:

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

Comme les propriétés sont implémentées en tant que méthodes sous le capot, cela retournera un nom comme “get_MyIndex”. Si vous ne voulez pas la partie “get_”, vous pouvez soustraire quelques caractères:

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

Vous pouvez utiliser un arbre d’expression pour obtenir le nom du membre. C’est un peu un jarret mais ça marche. Voici le code.

 private ssortingng GetPropertyName(Expression> propertySelector) { var memberExpression = propertySelector.Body as MemberExpression; if (memberExpression != null) { return memberExpression.Member.Name; } else { return ssortingng.empty; } } 

Avec ce code, vous pouvez faire ce qui suit

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

Code impitoyablement volé à la réponse de Romain sur le fil suivant

  • Obtenir le nom de la propriété de la classe

Vous devriez plutôt utiliser la propriété ViewState de votre contrôle:

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