进去setter属性名称(Get property name inside setter)

2019-07-29 05:56发布

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

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

但我们更希望是这样的:

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

二传手省略,但它只是使用相同的字符串值推到会议。 是否有某种方式使用反射,或不同的更好的解决方案?

Answer 1:

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


Answer 2:

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


Answer 3:

没有,没有一个简单的方法做你想做的事情。 我想,你是你已经写好的代码好得多

编辑: 这个答案已经收到了不少downvotes我也明白这是为什么。 虽然这是可以做到的OP想做的事也许我们都应该停下来,想一想它是否是明智的做什么。 套用的不朽名言伊恩·马尔科姆博士 ,只是因为你可以做一些事情并不意味着你应该。



Answer 4:

您可以使用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)];
    }
}


Answer 5:

您可以使用表达式树来获取成员名称。 这是一个有点典当的,但它的工作原理。 下面是代码。

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

无情的代码从罗曼的回答被盗以下螺纹

  • 获取类属性名


Answer 6:

你还是使用ViewState控件的属性:

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


文章来源: Get property name inside setter