Получить имя свойства внутри сеттера - PullRequest
22 голосов
/ 25 июня 2009

Я хочу сохранить свойство между обратными передачами в приложении 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 ]

23 голосов
/ 25 июня 2009
public static int Dummy {
    get {
        var propertyName = MethodBase.GetCurrentMethod().Name.Substring(4);
        Console.WriteLine(propertyName);
        return 0;
    }
}
13 голосов
/ 15 апреля 2016

Использование 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); }
}
12 голосов
/ 25 июня 2009

Нет, не существует простого способа сделать то, что вы хотите сделать. Я думаю, вы намного лучше с кодом, который вы уже написали.

Редактировать: Этот ответ получил довольно много отрицательных голосов, и я понимаю, почему. Хотя возможно сделать то, что хочет сделать ОП, возможно, нам всем следует остановиться и подумать, целесообразно ли это . Перефразируя бессмертные слова Доктор. Ян Малком , просто потому, что вы можете что-то делать, не значит, что вы должны.

7 голосов
/ 25 июня 2009

Вы можете использовать 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)];
    }
}
2 голосов
/ 25 июня 2009

Вы можете использовать дерево выражений, чтобы получить имя члена. Это немного скакать, но это работает. Вот код

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

Код безжалостно украден из ответа Ромен в следующей теме

1 голос
/ 25 июня 2009

Вы должны использовать ViewState свойство вашего элемента управления:

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