gpt4 book ai didi

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

转载 作者:可可西里 更新时间:2023-11-01 08:17:39 25 4
gpt4 key购买 nike

如果您使用 SharePoint 中的客户端对象模型并访问尚未初始化或已被

检索的属性
Context.Load(property); 
Context.ExecuteQuery();

你得到例如:

Microsoft.SharePoint.Client.PropertyOrFieldNotInitializedException

The collection has not been initialized. It has not been requests or the request has not been executed.

异常。

在访问这些属性之前是否有任何正确的方法来检查它们是否已经初始化/检索?没有 Try/Catch 方法。我不喜欢那个。

我想在抛出异常之前进行检查并处理它。

我已经检查过了

IsObjectPropertyInstantiated

IsPropertyAvailable

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

最佳答案

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

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

测试

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

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

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

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

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

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


如何动态判断客户端对象属性是否加载?

ClientObject.IsPropertyAvailableClientObject.IsObjectPropertyInstantiated方法期望将属性名称指定为字符串值,这可能会导致拼写错误,我通常更喜欢以下 extension method :

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);
}
}

用法

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))
{
//...
}
}

关于c# - 检测 ClientObject 属性是否已检索/初始化的正确方法,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/25680021/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com