Если я заполню GridView анонимными объектами, как я могу получить их свойства? - PullRequest
1 голос
/ 20 апреля 2009

У меня есть 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 методе я пытаюсь получить свойство, например идентификатор, но у него нет известного типа:

object element = e.Row.DataItem;
int id = element.id; // It's bad!!!!!!

Как мне это сделать?
Спасибо !!

Ответы [ 3 ]

4 голосов
/ 20 апреля 2009

Назовите свой тип!

public class GridType
{
    public int Id {get; set:} . . etc
}

затем в linq,

. . . select new GridType {...etc}

Затем в методе RowCreated приведите элемент данных к GridType, и вы сможете изменить его свойства.

В противном случае вы ищете утку, которая не печатает C #.

2 голосов
/ 20 апреля 2009

Вам нужно использовать отражение.

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.

1 голос
/ 20 апреля 2009

Это стоимость, которую вы должны заплатить, если хотите использовать анонимные объекты: вы теряете строгую типизацию, когда выходите из области, где объявлен ваш объект. Я бы рекомендовал явно объявить ваш тип, если вы не хотите играть с DataBinder.Eval ...

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...