我有一个静态方法ConvertObject< T>(object obj),它将基于对象的集合转换为泛型集合。根据obj参数的类型和类型参数T,该方法应返回特定类型的集合。例如,调用ConvertObject< List< string>>(obj),其中obj是一个ArrayList,将ArrayList转换为List< string>。
问题是方法重载不能用于区分不同的T参数,并且相同的对象类型(例如ArrayList)可以根据不同的类型参数转换为不同的输出类型,所以我不能使用常规方法重载。
我想出的最好的是调用ConvertToList< string>(ArrayList a)并返回List< string>:
if (typeof(T).IsGenericType && typeof(T).GetGenericTypeDefinition() == typeof(List<>))
{
MethodInfo method = typeof(Serialization).GetMethod("ConvertToList", BindingFlags.NonPublic | BindingFlags.Static);
MethodInfo generic = method.MakeGenericMethod(typeof(T).GetGenericArguments());
return (T)generic.Invoke(null, new[]{(ArrayList)obj});
}
它完美无缺,但我不习惯使用反射。我已经看到使用性能分析,Type.GetMethod()和MethodInfo.MakeGenericMethod()占用了相当多的CPU时间,而且我想捕获任何错误(例如使用数组类型参数而不是List&lt; ;&gt;)在编译时,而不是在运行时。
有没有办法使用泛型和静态类型,而不是运行时反射类型处理?
如果问题描述令人困惑,请告诉我。)