我想保留的ASP.Net应用程序回发之间的属性。 目前,这样做:
public int MyIndex
{
get
{
return (int)Session[ToString() + "MyIndex"];
}
}
但我们更希望是这样的:
public int MyIndex
{
get
{
return (int)Session[ToString() + #code_that_returns_property_name#];
}
}
二传手省略,但它只是使用相同的字符串值推到会议。 是否有某种方式使用反射,或不同的更好的解决方案?
public static int Dummy {
get {
var propertyName = MethodBase.GetCurrentMethod().Name.Substring(4);
Console.WriteLine(propertyName);
return 0;
}
}
使用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); }
}
没有,没有一个简单的方法做你想做的事情。 我想,你是你已经写好的代码好得多 。
编辑: 这个答案已经收到了不少downvotes我也明白这是为什么。 虽然这是可以做到的OP想做的事也许我们都应该停下来,想一想它是否是明智的做什么。 套用的不朽名言伊恩·马尔科姆博士 ,只是因为你可以做一些事情并不意味着你应该。
您可以使用MethodInfo.GetCurrentMethod()名称返回当前方法的名称:
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<TValue>(Expression<Func<BindingSourceType, TValue>> propertySelector)
{
var memberExpression = propertySelector.Body as MemberExpression;
if (memberExpression != null)
{
return memberExpression.Member.Name;
}
else
{
return string.empty;
}
}
有了这些代码,你可以做以下
return (int)Session[ToString() + GetPropertyName(MyIndex)];
无情的代码从罗曼的回答被盗以下螺纹
你还是使用ViewState
控件的属性:
public int MyIndex {
get {
object index = ViewState["MyIndex"];
return (null == index) ? -1 : (int)index;
}
set {
ViewState["MyIndex"] = value;
}
}