我在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()
};
}
属性Group
和Name
都出现在匿名类型声明中。
答案 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
,完全保留类型安全。