首页 > 解决方案 > 对象的通用解析

问题描述

我正在尝试为提供Parse和方法的值实现通用ParseExact方法。我的方法应该适用的类型是值类型(如doubleint)和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;
}

标签: c#

解决方案


    // 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;
    }

推荐阅读