1

各オブジェクトが次のように見える匿名オブジェクトの配列をキャストしようとしています。

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

匿名オブジェクトをキャストする方法に関するこのページを見つけましたが、同じ方法で行っています。それとも私は何かを逃しましたか?

4

1 に答える 1

7

それrelatedLinks自体が動的な値である場合、次の 2 つの問題があります。

  • 既報のラムダ式部分
  • 拡張メソッドは、動的な値に対して (拡張メソッドとして)呼び出すことはできません。Selectこれは、 メソッドとメソッドの両方に影響しToListます。

ラムダ式をキャストすることで、最初のものを回避できます。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();
于 2013-01-13T15:57:46.837 に答える