路由方法调用基于类型参数而不反射

时间:2013-12-28 13:28:01

标签: c# generics types arraylist

我有一个静态方法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< ;>)在编译时,而不是在运行时。

有没有办法使用泛型和静态类型,而不是运行时反射类型处理?

如果问题描述令人困惑,请告诉我。)

0 个答案:

没有答案