我有一个输入字符串,由文件接收。它包含一些值,以;分隔; 例如。 1; 2; 3
我想将其转换为List。该属性通过反射进行恢复,因此我没有任何修复列表类型。
简而言之:作为输入,我有一个PropertyInfo(PropertyType)和一个字符串值。我想得到一个类型列表" PropertyType"作为输出。
我想做点什么
private List<object> GetAsList(Type propertyType, string value)
{
List<object> list = new List<object>();
var items = value.Split('|');
foreach (var item in items)
{
list.Add(Convert.ChangeType(item, propertyType.GetGenericArguments().Single()));
}
return list;
}
这里的问题是,我无法将List分配给,比方说List()。我可以使用这样的东西:
if(propertyType == typeof(List<Int32>)
list = new List<Int32>();
else if(propertyType == typeof(List<Int64>)
list = new List<Int64>();
[...]
在我看来,这不是一个很好的解决方案。你知道如何解决这个问题吗?
答案 0 :(得分:4)
使您的方法通用:
private List<T> GetAsList<T>(string value)
{
List<T> list = new List<T>();
var items = value.Split('|');
foreach (var item in items)
{
list.Add((T)Convert.ChangeType(item, typeof(T)));
}
return list;
}
并像这样使用它:
List<int> listOfInt = GetAsList<int>("1|2|3");
List<long> listOfLong = GetAsList<long>("5|6|7");
List<double> listOfDouble = GetAsList<double>("1.1|2|3.3");
如果在编译时不知道类型,可以使用反射调用GetAsList:
var propTypeDouble = typeof(List<double>);
var listOfDoubleRuntime = typeof([DelaringType])
.GetMethod("GetAsList")
.MakeGenericMethod(propTypeDouble.GetGenericArguments().First())
.Invoke(null, new[] {"1.1|2.2|3.3"});
答案 1 :(得分:0)
如果可能,我会按照其他人的建议使您的方法通用,但是,如果不可能,您可以使用Type
参数创建一个实例,如下所示:
Type targetType = typeof(List<>).MakeGenericType(propertyType);
IList result = Activator.CreateInstance(targetType);
答案 2 :(得分:0)
你应该使用这样的东西 -
private static List<T> GetAsList<T>(string value)
{
List<T> list = new List<T>();
var items = value.Split('|');
foreach (var item in items)
{
TypeConverter converter = TypeDescriptor.GetConverter(typeof(T));
if (converter != null)
{
list.Add((T)converter.ConvertFrom(item));
}
}
return list;
}
和消费一样 -
List<Int32> demoList = new List<Int32>();
demoList = GetAsList<Int32>("1|2|5|7");
答案 3 :(得分:0)
<强>列表&LT; T&GT;列表; 强>
是匿名类型,直到您想要创建它的实例。
<强>列表&LT;动态&GT;列表; 强> 即使在您创建了它的实例之后,它仍然是动态类型
<强>列表&LT;动态&GT; list = new List&lt;动态&GT;()强>