Я ищу способ избежать подробных перегрузок в случае метода, который 1) всегда будет преобразовывать параметр в строку и 2) должен быть доступен для передачи других типов в качестве параметра.Как избежать перегрузки методов для нескольких типов параметров (иначе, чем с помощью параметра объекта)?
Как всегда картина сниппет стоит тысячи слов и нашел следующее решение соотв. Пример: (т.е. используя параметр объекта, который is cast to IFormattable для passing invariant culture)
public static string AppendHexSuffix(this object hexNumber)
{
string hexString = (hexNumber as IFormattable)? // Cast as IFormattable to pass inv cul
.ToString(null, CultureInfo.InvariantCulture) ?? hexNumber.ToString();
if (!hexString.StartsWith("0x", true, CultureInfo.InvariantCulture)
&& !hexString.EndsWith("h", true, CultureInfo.InvariantCulture))
{
hexString += "h"; // Append hex notation suffix, if missing prefix/suffix
}
return hexString;
}
Хотя, насколько я проверил, это, кажется, работает нормально (поправьте меня, если я что-то не хватает), верхний код не выглядит особенно прямолинейным для меня и предпочел бы более интуитивно понятное решение.
Окончательный Вопрос: есть ли другие более элегантный способ, как решить эту 1) без использования подхода верхнего объекта параметра и 2) без явного объявить перегрузку для каждого типа?
Примечание: верхний фрагмент кода необходимо принимать строго в качестве примера, так как if
-statement части, имеет смысл только в случае «реальной» строка передается в качестве параметра.
EDIT: После принятия во внимание ответы + комментарии у меня есть, и после еще нескольких испытаний, следующее окончательное внедрение, кажется, лучше всего подходит для моего случая:
/// <summary>
/// Converts any type to string and if hex notation prefix/suffix is missing
/// yet still a valid hex number, then appends the hex suffix
/// </summary>
/// <param name="hexNumber">Takes a string, decimal and other types as parameter</param>
/// <returns>Returns input object content as string with hex notation</returns>
public static string AppendHexSuffix<T>(this T hexNumber)
{
// Cast as IFormattable to pass hex format ("X") & invariant culture
var hexString = (hexNumber as IFormattable)?
.ToString("X", CultureInfo.InvariantCulture).Trim() ?? hexNumber.ToString().Trim();
int unused;
if (!hexString.StartsWith("0x", true, CultureInfo.InvariantCulture)
&& !hexString.EndsWith("h", true, CultureInfo.InvariantCulture)
&& int.TryParse(// No hex prefix/suffix, but still a valid hexadecimal number
hexString, NumberStyles.HexNumber, CultureInfo.InvariantCulture, out unused))
{
hexString += "h";
}
return hexString;
}
При этом он также должен игнорировать параметры/объекты, где шестнадцатеричный формат не имеет смысла, как указано в комментарии от @InBetween. Примечательная ошибка: забыл формат «X» для первого вызова .ToString().
'AppendHexSuffix (это Т HexNumber), где Т: IFormattable'? –
stuartd
Возможно, вы разместите это на [Code Review] (http://codereview.stackexchange.com/), так как не кажется, что вы просите о помощи в решении проблемы, как таковой. –
В вашем текущем решении будет введен тип box и value, в котором можно избежать дженериков. Как бы то ни было, что произойдет, если вы передадите объект, где шестнадцатеричный формат не имеет смысла? Ни дженерики, ни ваше текущее решение не защитят вас от этого. – InBetween