如何将逗号分隔的字符串转换为List <t>,其中T是未知的,直到运行时</t>

时间:2013-10-02 17:13:01

标签: c# list generics reflection

给定功能

T Func<T>(string val) {}

其中目标是将val转换为T,其中T可以是int,或者也可以是List(在这种情况下,val是逗号分隔的事物列表,希望可以转换为Ts

忽略int版本,因为它很简单,如何将字符串转换为List

1 个答案:

答案 0 :(得分:-2)

当我输入这个问题时,答案就出现了,所以我把这个问题作为对其他人的指导来解答。

我有一个像

这样的功能
T Func<T>(string val) {}

在这个函数中我做了各种处理,其中一项是将val转换为T。

我有另一个用于此目的的功能

T ChangeType<T>(this object value)

这个函数主要是Convert.ChangeType的一个包装器,带有一些额外的处理,来处理Convert.ChangeType无法开箱即用的东西(从其他地方的stackoverflow中窃取)

对于大多数类型来说,一切都很有效,但在某些情况下,T是List,而val则是以逗号分隔的值列表。

我可以通过

正确判断T是否为List
if (returnType.IsGenericType && returnType.GetGenericTypeDefinition() == typeof(List<>))

然后我可以实例化相应的列表返回类型,如下所示

T list = (T)Activator.CreateInstance(returnType);

现在,我需要在字符串中的每个拆分值上调用我的ChangeType,并将它们添加到列表中。

var method = typeof (XmlUtil).GetMethod("ChangeType", new [] {typeof(object)});
var genericMethod = method.MakeGenericMethod(subType);
var convertedItem = genericMethod.Invoke(null, new [] {item});
var subType = returnType.GetGenericArguments()[0];

到目前为止一切顺利。现在我有一个

dynamic list; //instantiated with a List<TT>
var convertedItem; // which is typed as an object, instantiated with a type TT.

如何致电

list.Add(convertedItem);

动态将处理这样一个事实:我没有列表的已知接口,但在运行时我收到错误,因为我试图将对象添加到列表中,即使该对象实际上是类型T如实例化。

最终的答案是将List强制转换为非泛型IList,然后可以在其中添加对象。

System.Collections.IList list2;
list2 = (System.Collections.IList) list;
list2.Add(convertedItem);