从DataGrid.ItemsSource返回匿名类型集合

时间:2011-06-07 22:32:49

标签: c# wpf datagrid anonymous-types

我在WPF collection of anonymous type中写了DataGrid.ItemsSource。现在我想要它回来。我该怎么做,有可能吗?

如何重建匿名类型?

谢谢!

修改

确定。你能说这会有用吗?

if(this.AbcDataGrid.ItemsSource != null && this.XyzDataGrid.ItemsSource != null)
{
    var abcdata = (IEnumerable<dynamic>)this.AbcDataGrid.ItemsSource;
    var xyzdata = (IEnumerable<dynamic>)this.XyzDataGrid.ItemsSource;

    var d1 = abcdata.ToList().OrderByDescending(x => x.Id);
    var d2 = xyzdata.ToList().OrderByDescending(x => x.Id);

    var result = from i1 in d1
                 from i2 in d2
                 select new
                 {
                     Name  = i1.Name,
                     Group = i1.Group.ToString() + i2.Group.ToString()
                 };
} 

属性GroupName都出现在匿名类型声明中。

2 个答案:

答案 0 :(得分:1)

您必须将其视为dynamic类型。见http://msdn.microsoft.com/en-us/library/dd264736.aspx

但是,我建议您使用命名类,以便生产者和消费者可以就数据达成一致。

答案 1 :(得分:1)

有几种选择,但最好的选择是:不要这样做。匿名类型仅用于一个函数,而不是将它们存储在某个地方然后检索它们。只需创建一个普通的类。

如果您确定要使用匿名类型,可以使用cast by example

var anons = new[] { new { prop1 = 1, prop2 = "bar" }, new { prop1 = 42, prop2 = "foo" } };
IEnumerable casted = anons;
var castedBack = CastByExample(anons, new[] { new { prop1 = 0, prop2 = "" } });

或者您可以使用动态:

var d = (IEnumerable<dynamic>)casted;

请注意,您可以强制转换为dynamic[],但这样做并不安全。另一个选择是转换为dynamic,完全保留类型安全。