Подтвердить что ты не робот

Получить имя свойства внутри сеттера

Я хочу сохранить свойство между postbacks в приложении ASP.Net. В настоящее время это делает:

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

но предпочтет что-то вроде:

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

Сеттер опущен, но он просто вызывает значение в сеансе, используя ту же строку. Есть ли способ использовать отражение или другое лучшее решение?

4b9b3361

Ответ 1

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

Ответ 2

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

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

Ответ 3

Использование 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); }
}

Ответ 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)];
    }
}

Ответ 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)];

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

Ответ 6

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

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