You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

C#:无IConvertible时如何通过反射转换类型?CastTo返回类型错误

解决SharePoint ClientContext.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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.13 06:37:45