Это использование дженериков правильно? - PullRequest
0 голосов
/ 29 августа 2011

После того, как вас опускает простая кодовая строка, например

char _letter = (char)Session["currentLetter"];

сбой при сбросе сеанса, я обнаружил, что хотел что-то попробовать. (currentLetter отслеживает положение в пользовательской таблице)

public static class SessionManager
{
    public static T ValueOrDefault<T>(HttpSessionStateBase session, string sessionkey, T defaultvalue)
    {
        object item = session[sessionkey];
        if (item != null && item.GetType() == typeof(T))
        {
            return (T)item;
        }
        else
        {
            return (T)defaultvalue;
        }

    }
}

Это очень неправильно? Или я что-то здесь делаю? (Код работает, кстати)

Ответы [ 3 ]

1 голос
/ 29 августа 2011

мне это кажется правильным - но вы можете убрать приведение к T с

return (T)defaultvalue;

в

return defaultvalue;

как вы определили значение по умолчанию как T.

1 голос
/ 29 августа 2011

Еще несколько комментариев:

  1. Вместо item.GetType() == typeof(T) вы, возможно, хотели использовать:

    typeof(T).IsAssignableFrom(item.GetType()). Это позволит вам поддерживать чтение типа, полученного из T.

  2. Тем не менее, в вашем конкретном случае, если я правильно понимаю сценарий, я бы вернул значение по умолчанию, только если условие item == null выполнено.

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

    Я бы рискнул предположить, что если вызывающая сторона пытается получить значение, используя неправильный тип, это всегда из-за ошибки (а не, например, из-за неверного ввода пользователя), и поэтому Я бы предпочел, чтобы мне накинули InvalidCastException, чтобы можно было исправить ошибку (вместо того, чтобы скрыть ошибку, возвращая значение по умолчанию).

1 голос
/ 29 августа 2011

Я бы заменил item.GetType() == typeof(T) на item is T.Таким образом, он поддерживает предоставление типов значений в качестве базового класса того, что вы хотите.Возможно, вы захотите сделать свой метод тоже методом расширения.

currentLetter отслеживает положение в пользовательской таблице

Я думаю, что это не должно быть состояние сеанса впервое место.Но, не зная больше о том, что вы подразумеваете под этим, трудно быть уверенным.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...