【发布时间】:2017-01-17 16:33:32
【问题描述】:
我正在寻找一种方法如何避免冗长的重载,以防 1) 将始终将参数转换为字符串并且 2) 应该可用于传递其他类型作为参数。
一如既往一张图片 sn-p值一千字,并找到了以下解决方案。示例:(即通过使用对象参数,其中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)没有为每种类型显式声明重载?
注意:上面的 sn-p 应该严格作为示例,因为if-statement 部分只有在“真实”字符串作为参数传递的情况下才有意义。
编辑:在考虑了我得到的答案 + cmets 后,经过更多试验,以下最终实现似乎最适合我的情况:
/// <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 的评论中所指出的那样。值得注意的错误:忘记了第一个 .ToString() 调用的“X”格式。
【问题讨论】:
-
AppendHexSuffix<T>(this T hexNumber) where T : IFormattable? -
您可能会考虑将其发布到Code Review,因为您本身似乎并不是在寻求帮助来解决问题。
-
您当前的解决方案将输入框和值类型,这是泛型可以避免的。无论如何,如果你传入一个十六进制格式没有意义的对象会发生什么?仿制药和您当前的解决方案都不会保护您免受这种情况的影响。
-
@devlin carnate:你的意思是也从 SO 中删除它?
-
@proGrammar :我只是说它可能更适合 CR 而不是 SO。
标签: c# casting hex overloading boilerplate