Как привести анонимный тип к указанному приведению, чтобы получить все его свойства - PullRequest
2 голосов
/ 25 сентября 2010

Этот код возвращает мне список, который я пытаюсь передать другой функции.

_ucItem.lblItemName.Text = itemRow.Field<string>("ITEM_NAME").ToString();
_ucItem.pbxItemImg.Image = itemRow.Field<string>("IMAGE").ToString();
_ucItem.lblItemName.Text = itemRow.Field<string>("FK_ITEM_ID").ToString();

Здесь я хочу заменить этот набор строк набором результатов, который я пытаюсь передать.Нужно ли объявлять класс для этого или есть какой-то способ выполнить ту же работу без определения структуры класса

private void SomeFunction()
{
   var distinctItems = itemListToCreate
            .Select(dr => new { FK_ITEM_ID = dr.Field<long>("FK_ITEM_ID") }).Distinct()
            .Join(_SelectProgram.FilteredItemDescription, outer => outer.FK_ITEM_ID,
            inner => inner.Field<long>("FK_ITEM_ID"),
            (inner, outer) => new 
                              { 
                                  inner.FK_ITEM_ID,
                                  ItemName = outer.Field<string>("ITEM_NAME"),
                                  ItemImage = outer.Field<byte[]>("IMAGE") 
                              }
            );

    CreateItemsDynamically(distinctItems.ToList());
}

private void CreateItemsDynamically<T>(List<T> itemListToCreate)
{
    itemListToCreate.ForEach(itemRow =>
    {                
        ucItem _ucItem = new ucItem();
        //Compute location for this usercontrol              

        _ucItem.lblItemName.Text = itemRow.Field<string>("ITEM_NAME").ToString();
        _ucItem.pbxItemImg.Image = itemRow.Field<string>("IMAGE").ToString();
        _ucItem.lblItemName.Text = itemRow.Field<string>("FK_ITEM_ID").ToString();

        _ucItem.TodayButton_OnClick += new EventHandler(_ucItem_TodayButton_OnClick);
        _ucItem.MultiDateButton_OnClick += new EventHandler(_ucItem_MultiDateButton_OnClick);

        pnlItemCollection.Controls.Add(_ucItem);
        _SelectProgram.ItemCollectionList.Add(_ucItem);
    });
}

Ответы [ 3 ]

2 голосов
/ 25 сентября 2010

Мне не совсем понятно, что вы пытаетесь сделать. есть способы использования анонимных типов в разных методах, но они несколько хакерские. Я недавно писал в блоге ... но я бы не советовал его использовать. Точно так же вы могли бы использовать рефлексию - но опять же, я бы тоже не советовал.

Намного лучше создать тип, который представляет нужные значения ... в основном именованную версию анонимного типа. Код будет легче понять и поддерживать в долгосрочной перспективе. (Я бы хотел, чтобы в будущей версии C # можно было объявить тип со всеми функциями анонимных в настоящее время типов, но с именами ... но сейчас это недоступно.)

1 голос
/ 25 сентября 2010

Тип имеет явное или анонимное имя.Если раньше, то вы объявляете тип - struct или class.

0 голосов
/ 25 сентября 2010

Они анонимны, вот и весь смысл!Вы можете увидеть тип, используя отражение, но если вам нужен доступ к нему, просто создайте тип - насколько это сложно?

...