C#:使用相同的函数将字符串转换为枚举和非枚举

时间:2016-06-29 15:13:16

标签: c# types enums casting converter

我有这行代码:

obj.Properties.ToList().ForEach(p => parameters.Add(Convert.ChangeType(p, ctor.GetParameters()[parameters.Count].ParameterType)));

obj.Properties是一个字符串数组(string[]),parameters是一个对象列表(List<object>)。我想创建一个类的新实例,为此我选择了一个构造函数(ctor),它的参数与我obj.Properties数组中的许多字符串一样多。

为了调用构造函数,我需要将字符串强制转换为构造函数需要的类型(正如您在上面看到的那样)。这适用于intbool,但构造函数也有enum参数,当我的代码尝试将字符串转换为枚举时,我得到InvalidCastException。< / p>

我读了一个SOF answer,其中建议使用Enum.Parse,但我想在一行中完成此操作(不依赖于它是否为枚举)。所以我使用了链接答案的解决方案:

public static T MyConvert<T>(String value)
{
    if (typeof(T).IsEnum)
    return (T)Enum.Parse(typeof(T), value);

    return (T)Convert.ChangeType(value, typeof(T));
}

然后:

obj.Properties.ToList().ForEach(p => parameters.Add(MyConvert< ctor.GetParameters()[parameters.Count].ParameterType>(p)));

但是我收到了一个错误:Operator '<' cannot be applied to operands of type 'method group' and 'Type'

我也试过

Type type = ctor.GetParameters()[parameters.Count].ParameterType;
obj.Properties.ToList().ForEach(p => parameters.Add(MyConvert<type>(p)));

但我得到了:'type' is a variable but is used like a type

这是一个有效的解决方案:

obj.Properties.ToList().ForEach(p =>
{
    if (ctor.GetParameters()[parameters.Count].ParameterType.IsEnum)
    {
        parameters.Add(Enum.Parse(ctor.GetParameters()[parameters.Count].ParameterType, p));
    }
    else
    {
        parameters.Add(Convert.ChangeType(p, ctor.GetParameters()[parameters.Count].ParameterType));
    }
});

但有没有办法为枚举和非枚举使用相同的代码?所以,我在ForEach中寻找没有if(...IsEnum)的解决方案。

1 个答案:

答案 0 :(得分:0)

我找到了一个解决方案:使MyConvert函数非泛型(这样在运行时就知道确切的类型就足够了,而不是在编译时)。

public static object MyConvert(String value, Type T)
{
    if (T.IsEnum)
        return Enum.Parse(T, value, true);

    return Convert.ChangeType(value, T);
}

然后:

obj.Properties.ToList().ForEach(p => parameters.Add(Parse(p, ctor.GetParameters()[parameters.Count].ParameterType)));