如果我用匿名对象填充GridView,我怎样才能获得它们的属性?

时间:2009-04-20 14:59:29

标签: asp.net linq gridview

我有一个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!!!!!!

我该怎么办?
谢谢!

3 个答案:

答案 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 ...