尝试投放匿名对象,剃刀时出错(Error when trying to cast anonymous

2019-08-06 16:36发布

我想投匿名对象,其中每个对象看起来像这样的数组:

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

我已经声明了一个类“链接”,以该匿名对象应铸造

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

我发现这对如何投匿名对象的页面,但即时通讯做同样的方式。 还是我错过了什么?

Answer 1:

如果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作为扩展方法,而不是-但你仍然需要有一个强类型的代表。 因此,例如,后一个版本将成为:

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


文章来源: Error when trying to cast anonymous object, Razor