Хотите, чтобы вызывающие абоненты могли изменять словарь? Если это так, то иметь статичный звук - очень странная идея. Если нет, то вам действительно нужно иметь возможность отвечать на запросы для Accept и AcceptCharset, что я, вероятно, сделал бы в простом выражении switch.
Вы говорите, что действительно хотите использовать Hashtable - почему? Какая картина здесь больше?
Статическое отображение изменчивых структур данных - это почти всегда плохая идея. Если вам нужен помощник для построения хеш-таблицы с некоторыми начальными значениями, тогда я бы сделал это методом, а не свойством. Если вам не нужна мутация, я бы написал метод для извлечения значения для конкретного HttpRequestHeader
, а не для демонстрации коллекции. Например:
public static class HTTP
{
public static string GetHeaderString(HttpRequestHeader header)
{
// Use a dictionary here if you want. The API is the important bit
switch (header)
{
case HttpRequestHeader.Accept: return "Accept";
case HttpRequestHeader.AcceptCharset: return "Accept-Charset";
default: throw new KeyNotFoundException(header.ToString());
}
}
}
Другим вариантом может быть перечисление заголовков в стиле Java:
public sealed class RequestHeader
{
public static RequestHeader Accept = new RequestHeader("Accept");
public static RequestHeader AcceptCharset =
new RequestHeader("Accept-Charset");
private readonly string name;
private RequestHeader(string header)
{
this. name = name;
}
public string Name
{
get { return name; }
}
}
Вам нужно будет выполнить проверку по null
, но это будет единственное недопустимое значение RequestHeader, которое вы можете получить. (Перечисления не проверяются по диапазону, так что кто-то может легко написать ((HttpRequestHeader)-1)
в вашем текущем коде ... другими словами, это не исправит проверку аргументов.)
РЕДАКТИРОВАТЬ: В ответ на комментарий, если вы используете C # 3 и хотите активную инициализацию (чтобы облегчить жизнь), вы можете написать:
public static class HTTP
{
private static readonly Dictionary<HttpRequestHeader, string> Headers =
new Dictionary<HttpRequestHeader, string>
{
( HttpRequestHeader.Accept, "Accept" ),
( HttpRequestHeader.AcceptCharset, "Accept-Charset" )
};
public static string GetHeaderString(HttpRequestHeader header)
{
return Headers[header];
}
}