我有一个GridView,我通过LINQ表达式填充 像这样:
GridView1.DataSource = from c in customers, o in c.Orders,
total = o.Total where total >= 2000 select new {id = c.CustomerID,
order = o.OrderID, total = total};
在 RowCreated 方法中,我尝试获取一个属性,例如id,但它没有已知的类型:
object element = e.Row.DataItem;
int id = element.id; // It's bad!!!!!!
我该怎么办?
谢谢!
答案 0 :(得分:4)
为您的类型命名!
public class GridType
{
public int Id {get; set:} . . etc
}
然后在linq,
. . . select new GridType {...etc}
然后在RowCreated方法中,将dataitem强制转换为GridType,然后你可以访问它的属性。
否则你正在寻找C#不做的鸭子打字。
答案 1 :(得分:2)
你需要使用反射。
Type t = element.GetType();
int id = 0;
foreach (PropertyInfo p in t.GetProperties())
{
// Not very nice but finds an integer property called "id"
if (p.PropertyType == typeof(int) && p.Name == "id")
{
id = (int)p.GetValue(element, null);
}
}
使用Linq:
Type t = element.GetType();
int id = 0;
var pt = new List<PropertyInfo>();
pt.AddRange(t.GetProperties());
id = (int)pt.Where(p => p.PropertyType == typeof(int) && p.Name == "id").First().GetValue(element, null);
不确定它读得更好,特别是当Type.GetProperties返回一个必须转换为List的数组以获取Linq方法时。
答案 2 :(得分:1)
如果您想使用匿名对象,这是您必须支付的费用:当您离开声明对象的范围时,您将失去强类型。我建议明确声明您的类型,除非您想使用DataBinder.Eval ...