【问题标题】:Dynamically specifying lambda function parameters动态指定 lambda 函数参数
【发布时间】:2013-03-12 23:57:14
【问题描述】:

假设我有以下代码行:

context.Load(itemCollection, item => item.Include(i => i["Title"], i => i["Name"]));

有什么方法可以动态指定item.Include() 函数的参数,而不是像上面那样对它们进行硬编码?

理想情况下,我希望允许用户选择他们想要检索对象的属性,例如 TitleNameDescription 等。

仅供参考,这是ClientContext.Load 函数。这个函数来自Microsoft.SharePoint.Client.dll

public void Load<T>(T clientObject, params Expression<Func<T, object>>[] retrievals) where T : ClientObject
{
  if ((object) clientObject == null)
    throw new ArgumentNullException("clientObject");
  ClientAction.CheckActionParameterInContext(this, (object) clientObject);
  DataRetrieval.Load<T>(clientObject, retrievals);
}

【问题讨论】:

  • 是的,我一直在为 MS CRM 库制作这样的功能。您想调查 public void MyMethod&lt;t&gt;(Func&lt;Expression&lt;t,object&gt;&gt; expression) where t : 在表达式中扩展您想要的类型。无论如何,在 Func 上搜索更多示例

标签: c# .net c#-4.0 .net-4.0 lambda


【解决方案1】:

我没有必要的设置来测试它,但是这样的东西会起作用吗?

String[] keys = ...;
context.Load(   itemCollection
              , item => item
                        .Include(keys
                        .Select(key => { i => i[key] })
                        .ToArray()
            );

【讨论】:

  • 没有。我们不知道用户想要检索多少个键(属性)。
  • context.Load() 和 item.Include() 函数的签名是什么?
  • 用您要求的信息更新了我的问题。
【解决方案2】:

查看this question 的答案。
我在创建动态 where 子句时遇到了类似的问题,这就是我解决它的方法。

【讨论】:

    【解决方案3】:

    使用以下语法(适用于 JavaScript,但尚未在 C# 中测试过):

    context.load(this.list, 'Include(Title, Name)');
    

    'Include(Title, Name)' 是一个字符串,更容易根据用户输入生成。

    this.list指的是之前加载的共享点列表。

    【讨论】:

      猜你喜欢
      • 2013-12-23
      • 1970-01-01
      • 1970-01-01
      • 2021-07-28
      • 2017-06-15
      • 2014-03-29
      • 1970-01-01
      • 1970-01-01
      • 2019-02-23
      相关资源
      最近更新 更多