问题
I use C# asp.net4.
I have a method to populate a Repeater with Anonymous Types (Fields: Title, CategoryId), inside the Repeater I also placed a Label:
var parentCategories = from c in context.CmsCategories
where c.CategoryNodeLevel == 1
select new { c.Title, c.CategoryId };
uxRepeter.DataSource = parentCategories;
uxRepeter.DataBind();
I need to change Text Properties for each label inside my Repeater on Repeater Event ItemDataBound
protected void uxRepeter_ItemDataBound(object sender, RepeaterItemEventArgs e)
{
HyperLink link = (HyperLink)e.Item.FindControl("uxLabel");
uxLabel.Text = // How to do here!!!!!!!!
}
So I need set the properties for Label.Text using e.Item (or a better way if any).
My problem I'm not able to CAST the e.Item (Anonymous type Field Title) and set it as Text Propriety for my Label.
I understand Anonymous Type can be casted to only Object Type, but in my case my Anonymous Type has Title and CategoryId Fields.
My question:
How to cast and retrieve the field with I'm interested? Thanks for your time on this?
EDIT: SOME ERROR I RECEIVE:
Unable to cast object of type '<>f__AnonymousType0`2[System.String,System.Int32]' to type 'System.String'.
回答1:
The options Joseph presents are good ones, but there is a horrible way you can do this. It's somewhat fragile, as it relies on you specifying the anonymous type in exactly the same way in two places. Here we go:
public static T CastByExample<T>(object input, T example)
{
return (T) input;
}
Then:
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: Further wrinkle - the two anonymous type creation expressions have to be in the same assembly (project). Sorry for forgetting to mention that before now.
回答2:
You can't cast the anonymous type to anything because you literally have no type to cast it to, as you've basically pointed out already.
So you really have two options.
- Don't cast to an anonymous type, but rather a known type that you build just for handling this scenario or
- assign a dynamic variable to the item and use dynamic properties instead
Example 1:
var parentCategories = from c in context.CmsCategories
where c.CategoryNodeLevel == 1
select new RepeaterViewModel { c.Title, c.CategoryId };
Example 2: (also I think you're last line you meant to assign the link 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
}
回答3:
You can use a dynamic
in this case. I think the code would be:
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.
}
回答4:
Can't you just cast to (typeof(new { Title = "", CategoryID = 0 }))
?
来源:https://stackoverflow.com/questions/6901506/cast-an-anonymous-types-in-object-and-retrieve-one-field