我有这行代码:
obj.Properties.ToList().ForEach(p => parameters.Add(Convert.ChangeType(p, ctor.GetParameters()[parameters.Count].ParameterType)));
obj.Properties
是一个字符串数组(string[]
),parameters
是一个对象列表(List<object>
)。我想创建一个类的新实例,为此我选择了一个构造函数(ctor
),它的参数与我obj.Properties
数组中的许多字符串一样多。
为了调用构造函数,我需要将字符串强制转换为构造函数需要的类型(正如您在上面看到的那样)。这适用于int
和bool
,但构造函数也有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)
的解决方案。
答案 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)));