c# - 对象的通用解析
问题描述
我正在尝试为提供Parse
和方法的值实现通用ParseExact
方法。我的方法应该适用的类型是值类型(如double
等int
)和TimeSpan
.
有什么想法可以实现我所描述的吗?
为了更好地理解我需要什么,我编写了一些代码,粗略地描述了我想要实现的目标(显然它不起作用)。Flags
只是一些enum
。
public Dictionary<Flags, object> FlagValues { get; } = new Dictionary<Flags, object>();
public T GetFlagValue<T>(Flags flag, string formatString = null) where T : struct
{
T result = default(T);
if (FlagValues.TryGetValue(flag, out object flagValueRaw))
{
if (formatString == null)
{
result = T.Parse(flagValueRaw, CultureInfo.InvariantCulture);
}
else
{
result = T.ParseExact(flagValueRaw, formatString, CultureInfo.InvariantCulture);
}
}
return result;
}
解决方案
// Error handling not included
// Since the first parameter is string in all Parse, ParseExact.
public Dictionary<Flags, string> FlagValues { get; } = new();
public T GetFlagValue<T>(Flags flag, string? formatString = null) where T : struct
{
if (FlagValues.TryGetValue(flag, out var flagValueRaw))
{
if (!string.IsNullOrEmpty(formatString))
{
var parseExact = typeof(T).GetMethod("ParseExact", new[] { typeof(string), typeof(string), typeof(IFormatProvider) });
if (parseExact is not null)
return (T)parseExact.Invoke(null, new object?[] { flagValueRaw, formatString, CultureInfo.InvariantCulture })!;
}
var parse = typeof(T).GetMethod("Parse", new[] { typeof(string), typeof(IFormatProvider) })!;
if (parse is not null)
return (T)parse.Invoke(null, new object?[] { flagValueRaw, CultureInfo.InvariantCulture })!;
}
return default;
}
推荐阅读
- html - Flexbox 行左对齐
- python - 使用 Python 在 Azure 上创建容器
- python - Reportlab:为什么两列输出恢复为单列?
- python - 正则表达式返回字符串中方括号中的整数
- jquery - 使用 jquery 分别克隆外部 div 和内部 div
- python - Python MemoryError:无法分配足够的内存
- asp.net-core-webapi - 处理来自 WebAPI Blazor(服务器端)调用的 ModelState 错误
- java - 将 JSON 转换为 HashMap 时出现 NullPointerException,代码如下
- graphql - GatsbyJS 将用户输入传递给 GraphQL
- javascript - 谷歌图表可视化条形图未显示