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