2011-08-01 6 views
5

は、私はC#のasp.net4を使用するオブジェクトに匿名型をキャストし、1つのフィールドを取得

私は匿名型(フィールド:タイトル、区分)でリピータを移入する方法を持っているが、リピータ内部で私はまた、ラベルを配置:

 var parentCategories = from c in context.CmsCategories 
           where c.CategoryNodeLevel == 1 
           select new { c.Title, c.CategoryId }; 
     uxRepeter.DataSource = parentCategories; 
     uxRepeter.DataBind(); 

私はそれぞれの文字のプロパティを変更する必要がありますラベルは、リピータイベントItemDataBound

protected void uxRepeter_ItemDataBound(object sender, RepeaterItemEventArgs e) 
    { 
     HyperLink link = (HyperLink)e.Item.FindControl("uxLabel"); 
     uxLabel.Text = // How to do here!!!!!!!! 
    } 

の私のリピータ内だから私はe.Item(またはもしあればより良い方法を)使用してLabel.Textのプロパティを設定する必要があります。

私の問題e.Item(匿名型のフィールドタイトル)をCASTできず、自分のラベルのテキストとして設定することができません。

匿名タイプはオブジェクトタイプのみにキャストできますが、私の場合は匿名タイプにタイトルとカテゴリIDフィールドがあります。

私の質問:

私が興味を持つフィールドをキャストして取得する方法?これにお時間をいただきありがとうございますか?

編集:私が受け取る SOME ERROR:

Unable to cast object of type '<>f__AnonymousType0`2[System.String,System.Int32]' to type 'System.String'. 

答えて

10

オプションジョセフのプレゼントは良いものですが、は、あなたがこれを行うことができます恐ろしい方法があります:私は、コードはと思います。それはあなたが2つの場所で正確同じように匿名型を指定することに依存しているように、それは、多少壊れやすいです。ここに私達は行く:

その後
public static T CastByExample<T>(object input, T example) 
{ 
    return (T) input; 
} 

object item = ...; // However you get the value from the control 

// Specify the "example" using the same property names, types and order 
// as elsewhere. 
var cast = CastByExample(item, new { Title = default(string), 
            CategoryId = default(int) }); 
var result = cast.Title; 

はEDIT:さらにしわ - 2つの匿名型の作成式は、同じアセンブリ(プロジェクト)でなければなりません。今まで言及するのを忘れて申し訳ありません。

+0

私が疑問に思っていたことは、同じ形状の2つの匿名型が型互換性のある実装の詳細か、互換性が必要な仕様の一部ですか? –

+0

包括的なコードをお寄せいただきありがとうございます。 – GibboK

+3

@Rex:これは仕様の一部です。私は私の上にリファレンスを持っていませんが、基本的に同じアセンブリ*内で、同じ順序で同じプロパティ名と型を持つ2つの匿名型の構築式は同じ型を参照する必要があります。 –

4

あなたは基本的にはすでに指摘してきたように、あなたは文字通り、それをキャストするいかなる種類を持っていないので、あなたは何にでも匿名型をキャストすることはできません。

実際には2つのオプションがあります。

  1. は匿名型にキャストしないでくださいではなく、あなたがこのシナリオや
  2. を処理するためだけの構築知られているタイプは、アイテムへの動的変数を割り当て、動的なプロパティを使用する代わりに

例1:

var parentCategories = from c in context.CmsCategories 
    where c.CategoryNodeLevel == 1 
    select new RepeaterViewModel { c.Title, c.CategoryId }; 

例2:(また、私はあなたがリンクVARを割り当てるためのもの、最後の行だと思う)

protected void uxRepeter_ItemDataBound(object sender, RepeaterItemEventArgs e) 
{ 
    HyperLink link = (HyperLink)e.Item.FindControl("uxLabel"); 
    dynamic iCanUseTitleHere = e.Item; 
    link.Text = iCanUseTitleHere.Title; //no compilation issue here 
} 
+0

お返事ありがとうございます。 Ex 1の代わりにあなたのExample 2の短所はありますか?この時間に感謝します – GibboK

+1

@GibboKあなたはあなたの強い入力を失うので、イベントハンドラに触れている開発者は、そのオブジェクトで何がアクセスできるのかをすでに知っていなければなりません。最初の例にすることで、あなたはあなたの強い型付けを得ることができます。イベントハンドラで知っておく必要があるのは、e.Itemをどのようなクラスにキャストするかだけです。コンパイル時に知られているものすべて。 – Joseph

+0

ありがとうございます。これについてのご意見ありがとうございます – GibboK

4

この場合、dynamicを使用できます。

protected void uxRepeter_ItemDataBound(object sender, RepeaterItemEventArgs e) 
{ 
    dynamic link = (dynamic)e.Item.FindControl("uxLabel"); 
    uxLabel.Text = link.Title; //since 'link' is a dynamic now, the compiler won't check for the Title property's existence, until runtime. 
} 
0

(typeof(new { Title = "", CategoryID = 0 }))にキャストできませんか?

関連する問題