如何将匿名类型转换为指定的强制类型以获取其所有属性

时间:2010-09-25 08:07:39

标签: c# linq generics delegates anonymous-types

此代码返回一个我想要传递给另一个函数的列表。

_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 个答案:

答案 0 :(得分:2)

我不太清楚你要做什么。 跨方法使用匿名类型的方式,但它们有点hacky。我blogged about one way a while ago ...但我建议不要使用它。同样,可以使用反射 - 但同样,我也不建议这样做。

创建一个代表你想要的值的类型是一个好主意...基本上是匿名类型的命名版本。从长远来看,代码将更容易理解和维护。 (我希望C#的未来版本能够声明一个具有当前匿名类型的所有功能的类型,但是带有名称......但现在不可用。)

答案 1 :(得分:1)

类型可以是显式命名的,也可以是匿名的。如果之前你声明了类型 - struct或class。

答案 2 :(得分:0)

他们是匿名的,这就是重点!您可以使用反射查看类型,但如果您需要访问它,只需输入一个类型 - 这有多难?