Я разбираю строку HTTP-запроса GET на ее компоненты. Пытаясь сделать его модульным (количество и типы параметров могут сильно различаться), я хочу иметь абстрактный базовый класс или интерфейс параметров, который определяет, было ли установлено свойство или нет, вместе с методом Set, который устанавливает значение. Есть ли способ сделать это с переменным типом параметра для метода Set?
Общая идея такова:
public abstract class Parameter
{
public bool IsSet { get; protected set; }
protected Parameter() { IsSet = false; }
public abstract void Set( --unknown type here-- );
}
Пример дочернего параметра будет выглядеть примерно так:
public class IntParameter : Parameter
{
public int Value { get; protected set; }
public void Set(int value)
{
Value = value;
IsSet = true;
}
}
С такой структурой я мог бы затем бросить каждый параметр запроса в соответствующий строго типизированный класс, но при этом убедиться, что все они работают согласованно. Причиной для свойства IsSet является возможность проверить, был ли параметр установлен или нет, поскольку некоторые параметры не имеют никаких «безопасных» значений, которые я точно знаю, не были преднамеренно переданы. Если значение не установлено, вместо него будет вставлено значение по умолчанию.
Глядя на проблему, я сомневаюсь, что с ней можно справиться, поскольку я хочу ее реализовать, но пример должен дать представление о том, что я хотел бы сделать.
Есть ли предложения о том, как лучше всего с этим справиться. Я не удивлюсь, если есть удобный шаблон дизайна или обычный способ сделать это, но мне не удалось найти его в Google.
Варианты, которые я вижу от руки:
- Не используйте наследование и полагайтесь на соглашение вместо согласованности. Скорее всего, мне не нужно было бы обрабатывать их через итерации списка или тому подобное, хотя, если бы я нашел способ сделать это, это могло бы открыть некоторые новые идеи или возможности.
- Используйте параметр объекта, а затем выполните некоторую функцию typeof () и переключите магию каким-либо образом, хотя это кажется мне очень уродливым и, так сказать, неполиморфным.
Есть еще идеи? :)