在setter中获取属性名称

我想在ASP.Net应用程序中的回发之间保留一个属性。 目前这样做:

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

但更喜欢这样的东西:

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

Setter省略了,但它只是使用相同的字符串将值推送到Session中。 有没有办法使用reflection,或者更好的解决方案?

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

不,没有一种简单的方法可以做你想做的事。 我认为你已经写好的代码会好得多。

编辑: 这个答案收到了不少赞成票,我明白为什么。 虽然可以做OP想要做的事情,但也许我们都应该停下来思考是否这样做是可取的 解释Ian Malcom博士不朽的话,仅仅因为你能做某事并不意味着你应该这样做。

使用CallerMemberName要快得多,并且可以轻松复制和粘贴其他属性。

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

您可以使用MethodInfo.GetCurrentMethod()。Name返回当前方法的名称:

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

由于属性是作为引擎下的方法实现的,因此将返回类似“get_MyIndex”的名称。 如果你不想要“get_”部分,你可以将几个字符子串:

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

您可以使用表达式树来获取成员名称。 这有点像飞节,但它确实有效。 这是代码。

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

使用该代码,您可以执行以下操作

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

代码在Romain的回答中被无情地窃取了以下post

  • 获取类属性名称

您应该使用ViewState属性:

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