c# - 尝试转换匿名对象 Razor 时出错

标签 c# linq lambda umbraco

我正在尝试转换一个匿名对象数组,其中每个对象如下所示:

new {type="internal",title="Linktitle",target="_blank",link="http://www.google.se"}

我已经声明了一个类“Link”,匿名对象应该被转换到它

class Link{
    public string type {get;set;}
    public string target {get;set;}
    public string title {get;set;}
    public string link {get;set;}
}

现在我正在尝试像这样转换对象

List<Link> links = Model.relatedLinks.Select(l => new Link{type=l.type,target=l.target,title=l.title,link=l.link}).ToList();

然后我得到错误

Cannot use a lambda expression as an argument to a dynamically dispatched operation without first casting it to a delegate or expression tree type

我找到了 this有关如何转换匿名对象的页面,但我以相同的方式进行操作。还是我错过了什么?

最佳答案

如果relatedLinks本身是一个动态值,你有两个问题:

  • 已报告的 lambda 表达式部分
  • 不能对动态值调用扩展方法(作为 扩展方法)。这会同时影响 SelectToList方法。

您可以通过转换 lambda 表达式来解决第一个问题。您可以通过调用 Enumerable.Select 解决第二个问题直接:

// Note: don't use var here. We need the implicit conversion from
// dynamic
IEnumerable<Link> query = Enumerable.Select(Model.relatedLinks, 
                              (Func<dynamic, Link>) (l => new Link { 
                                                            type = l.type,
                                                            target = l.target,
                                                            title = l.title,
                                                            link = l.link } );
var links = query.ToList();

或者为了格式化:

Func<dynamic, Link> projection = l => new Link { 
                                        type = l.type,
                                        target = l.target,
                                        title = l.title,
                                        link = l.link };
IEnumerable<Link> query = Enumerable.Select(Model.relatedLinks, projection);
var links = query.ToList();

如果Model.relatedLinks已经是IEnumerable<dynamic> (或类似的东西)然后你可以打电话 Select作为扩展方法 - 但你仍然需要有一个强类型的委托(delegate)。因此,例如,后一个版本将变为:

Func<dynamic, Link> projection = l => new Link { 
                                        type = l.type,
                                        target = l.target,
                                        title = l.title,
                                        link = l.link };
IEnumerable<Link> query = Model.relatedLinks.Select(projection);
var links = query.ToList();

关于c# - 尝试转换匿名对象 Razor 时出错,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/14305099/

相关文章:

c# - LINQ 计数出现次数

lambda - 为什么在不安全操作之后而不是在整个 forEach 循环之后抛出 ConcurrentModificationException ?

C# const 与 lambda 效率

c# - 使用并行程序集加载 x64 或 x32 版本的 DLL

c# - 使用 C# 登录 JIRA Rest API

entity-framework - 执行 Entity Framework 集合排序所需的通用函数

c# - 如何在 Linq 中使用 Sql View

c++ - 如何将 [[nodiscard]] 属性应用于 lambda?

c# - Win7的Virtual Machines文件夹如何获取?

c# - 使用带有 SSH.NET 的 C# 通过 SSH 流式传输/拖尾数据会泄漏内存