检测ClientObject属性是否已被检索/初始化的正确方法

Mar*_*ark 13 c# sharepoint csom

如果您正在使用SharePoint中的客户端对象模型,并且访问尚未初始化或已由其检索的属性

Context.Load(property); 
Context.ExecuteQuery();
Run Code Online (Sandbox Code Playgroud)

你得到一个例子:

Microsoft.SharePoint.Client.PropertyOrFieldNotInitializedException

要么

该集合尚未初始化.它没有被请求或者请求没有被执行.

例外.

如果已经初始化/检索这些属性,是否有任何正确的方法可以检查它们?没有Try/Catch方法.我不喜欢那个人.

我想在抛出异常之前检查并处理它.

我已经查过了

IsObjectPropertyInstantiated

IsPropertyAvailable

方法,但他们没有帮助.IsPropertyAvaiable仅检查标量属性,并且不会给出结果,例如Web.Lists,虽然未初始化IsObjectPropertyInstantiated,Web.Lists但返回true Web.Lists.

Vad*_*hev 26

我会说你的问题在某种程度上已经包含了正确的答案.

为了确定是否加载了客户端对象属性,可以使用以下方法:

测试

测试用例1:仅加载标量属性

ctx.Load(ctx.Web, w => w.Title);
ctx.ExecuteQuery();
//Results:
ctx.Web.IsObjectPropertyInstantiated("Lists")  False
ctx.Web.IsPropertyAvailable("Title")    True
Run Code Online (Sandbox Code Playgroud)

测试用例2:仅加载复合属性

ctx.Load(ctx.Web, w => w.Lists);
ctx.ExecuteQuery();
//Results:
ctx.Web.IsObjectPropertyInstantiated("Lists")  True
ctx.Web.IsPropertyAvailable("Title")    False
Run Code Online (Sandbox Code Playgroud)

测试用例3:加载标量和复合属性

ctx.Load(ctx.Web, w=>w.Lists,w=>w.Title);
ctx.ExecuteQuery();
//Results
ctx.Web.IsObjectPropertyInstantiated("Lists")  True
ctx.Web.IsPropertyAvailable("Title")    True
Run Code Online (Sandbox Code Playgroud)

如何动态确定是否加载了客户端对象属性?

由于ClientObject.IsPropertyAvailableClientObject.IsObjectPropertyInstantiated方法期望将属性名称指定为字符串值并且可能导致拼写错误,因此我通常更喜欢以下扩展方法:

public static class ClientObjectExtensions
{
    /// <summary>
    /// Determines whether Client Object property is loaded
    /// </summary>
    /// <typeparam name="T"></typeparam>
    /// <param name="clientObject"></param>
    /// <param name="property"></param>
    /// <returns></returns>
    public static bool IsPropertyAvailableOrInstantiated<T>(this T clientObject, Expression<Func<T, object>> property)
        where T : ClientObject
    {
        var expression = (MemberExpression)property.Body;
        var propName = expression.Member.Name;
        var isCollection = typeof(ClientObjectCollection).IsAssignableFrom(property.Body.Type);
        return isCollection ? clientObject.IsObjectPropertyInstantiated(propName) : clientObject.IsPropertyAvailable(propName);
    }
}
Run Code Online (Sandbox Code Playgroud)

用法

using (var ctx = new ClientContext(webUri))
{

     ctx.Load(ctx.Web, w => w.Lists, w => w.Title);
     ctx.ExecuteQuery();


     if (ctx.Web.IsPropertyAvailableOrInstantiated(w => w.Title))
     {
         //...
     }

     if (ctx.Web.IsPropertyAvailableOrInstantiated(w => w.Lists))
     {
         //...
     }
} 
Run Code Online (Sandbox Code Playgroud)

  • 这是一个很好的小扩展方法,它就像一个魅力! (2认同)
  • OfficeDev PnP 现在包含“EnsureProperty”和“EnsureProperties”方法。 (2认同)