使用针对SharePoint 2010/2013客户端对象模型的反射来读取.net中的私有变量是否安全?
在某些读/写/更新操作期间,SharePoint客户端对象模型返回“(503)服务不可用”异常,请重新尝试解决此问题。 这里,重试操作创建了一个新的返回值集合,我们无法将其分配回原始返回值对象 注意:LoadQuery()方法的返回值出现在“ClientQueryableResult.m_data”私有变量中 我们给出了下面的反射代码。但问题是,我们不确定将反射与SharePoint客户端对象模块一起使用以读取其中一个私有变量值是否安全 e、 g.加载我们拥有的SharePoint组使用针对SharePoint 2010/2013客户端对象模型的反射来读取.net中的私有变量是否安全?,sharepoint,sharepoint-2010,sharepoint-2013,system.reflection,sharepoint-clientobject,Sharepoint,Sharepoint 2010,Sharepoint 2013,System.reflection,Sharepoint Clientobject,在某些读/写/更新操作期间,SharePoint客户端对象模型返回“(503)服务不可用”异常,请重新尝试解决此问题。 这里,重试操作创建了一个新的返回值集合,我们无法将其分配回原始返回值对象 注意:LoadQuery()方法的返回值出现在“ClientQueryableResult.m_data”私有变量中 我们给出了下面的反射代码。但问题是,我们不确定将反射与SharePoint客户端对象模块一起使用以读取其中一个私有变量值是否安全 e、 g.加载我们拥有的SharePoint组 var g
var groups = _ClientContext.LoadQuery(_ClientContext.Web.SiteGroups);
_ClientContext.ExecuteQuery();
下面的代码缓存LoadQuery()参数,并在重新尝试的异常情况下使用它
object OrgResult, NewResult, Params;
Params = clientObjects
OrgResult = _ClientContext.LoadQuery(clientObjects);
try {_ClientContext.ExecuteQuery();}
catch (WebException webEx){
NewResult = _ClientContext.LoadQuery(Params);
_ClientContext.ExecuteQuery();
object data = NewResult.GetPrivateFieldValue("m_data");
if (data != null)
OrgResult.SetPrivateFieldValue("m_data", data);
}
// Reflection method to read private value
public static object GetPrivateFieldValue(this object src, string fieldName)
{
object value = null;
FieldInfo fieldInfo = src.GetType().GetField(fieldName, BindingFlags.NonPublic
|BindingFlags.Instance);
if (fieldInfo != null)
value = fieldInfo.GetValue(src);
return value;
}
使用基于反射的代码总是不安全的,因为它可能会在将来的SharePoint升级中中断。您有两种选择: