我想在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中。 有没有办法使用反射,或者更好的解决方案呢?
答案 0 :(得分:23)
public static int Dummy {
get {
var propertyName = MethodBase.GetCurrentMethod().Name.Substring(4);
Console.WriteLine(propertyName);
return 0;
}
}
答案 1 :(得分:13)
使用 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); }
}
答案 2 :(得分:12)
不,没有一种简单的方法可以做你想做的事。我认为使用您已经编写的代码可以更好地 。
编辑: 这个答案已经收到了不少赞成票,我明白为什么。虽然可以做OP想要做的事情,但也许我们应该停下来思考是否可取这样做。解释Dr. Ian Malcom的不朽词语,仅仅因为你可以做某事并不意味着你应该这样做。
答案 3 :(得分:7)
您可以使用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)];
}
}
答案 4 :(得分:2)
您可以使用表达式树来获取成员名称。这有点像飞节,但它确实有效。这是代码。
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)];
代码在Romain的回答中被无情地窃取了以下帖子
答案 5 :(得分:1)
您应该使用控件的ViewState
属性:
public int MyIndex {
get {
object index = ViewState["MyIndex"];
return (null == index) ? -1 : (int)index;
}
set {
ViewState["MyIndex"] = value;
}
}