C#:无IConvertible时如何通过反射转换类型?CastTo返回类型错误
你在反射调用CastTo<T>时踩了一个容易忽略的小坑——给泛型方法指定的类型是源对象field的Field类型,而不是你真正需要的FieldChoice类型,这才导致返回值始终是Field,没法转成目标类型。
正确的反射实现步骤
- 获取FieldChoice的类型
Type fieldChoiceType = sharepointClient.GetType("Microsoft.SharePoint.Client.FieldChoice");
- 获取ClientContext类型中
CastTo方法的泛型定义
Type clientContextType = clientContext_temp.GetType(); // 指定参数类型确保拿到正确的重载(CastTo接受一个Field参数) MethodInfo castToMethodDef = clientContextType.GetMethod( "CastTo", BindingFlags.Public | BindingFlags.Instance, new Type[] { typeof(Field) } );
- 用FieldChoice类型构造泛型方法
MethodInfo genericCastTo = castToMethodDef.MakeGenericMethod(fieldChoiceType);
- 调用方法,直接得到FieldChoice类型的实例
var choiceProduct = genericCastTo.Invoke(clientContext_temp, new object[] { field });
为什么原有代码不生效?
你之前的代码里用了MakeGenericMethod(field.GetType()),这相当于反射调用了CastTo<Field>(field)——返回的自然还是Field类型。后续尝试用Convert.ChangeType转换当然失败,因为FieldChoice既没有合适的构造函数,也没实现IConvertible,但其实你根本不需要这一步,CastTo<T>本身就负责完成类型转换的工作。
额外说明
SharePoint Client Object Model的CastTo<T>方法内部是通过客户端对象的底层类型信息来完成转换的,它会复用传入的Field实例的数据,直接包装成目标子类(比如FieldChoice)的对象,完全不需要你手动创建实例。只要泛型参数指定正确,调用后就能直接得到你需要的类型实例。
内容的提问来源于stack exchange,提问作者Nico Louis
相关产品推荐
相关产品推荐

