给定功能
T Func<T>(string val) {}
其中目标是将val转换为T,其中T可以是int,或者也可以是List(在这种情况下,val是逗号分隔的事物列表,希望可以转换为Ts
忽略int版本,因为它很简单,如何将字符串转换为List
答案 0 :(得分:-2)
当我输入这个问题时,答案就出现了,所以我把这个问题作为对其他人的指导来解答。
我有一个像
这样的功能T Func<T>(string val) {}
在这个函数中我做了各种处理,其中一项是将val转换为T。
我有另一个用于此目的的功能
T ChangeType<T>(this object value)
这个函数主要是Convert.ChangeType的一个包装器,带有一些额外的处理,来处理Convert.ChangeType无法开箱即用的东西(从其他地方的stackoverflow中窃取)
对于大多数类型来说,一切都很有效,但在某些情况下,T是List,而val则是以逗号分隔的值列表。
我可以通过
正确判断T是否为Listif (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);