在setter中获取属性名称

时间:2009-06-25 15:16:14

标签: c# .net reflection properties

我想在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中。 有没有办法使用反射,或者更好的解决方案呢?

6 个答案:

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