在LINQ语句中强制转换对象类型

本文关键字:转换 对象 类型 LINQ 语句 | 更新日期: 2023-09-27 18:16:08

我有一个Layer集合,其中包含一个Content对象作为属性。我如何将这个Content转换为其原始对象以获得其在LINQ语句中的属性?

例如:

var item = Layers.FirstOfDefault(x =>(PushPin)x.Content.Description == "xyz");

在本例中,ContentPushPin对象类型,我想将其Description属性与xyz进行比较

在LINQ语句中强制转换对象类型

如果Content可以是PushPin以外的东西,那么你需要在

var item = Layers.FirstOrDefault(x => x.Content is PushPin && ((PushPin)x.Content).Description == "xyz");

用圆括号括起来

var item = Layers.FirstOfDefault(x => ((PushPin)x.Content).Description == "xyz");

如果图层中的所有内容对象都是PushPin对象,这应该没问题:

var item = Layers.Select(x => x.Content).Cast<PushPin>().FirstOrDefault(x => x.Description == "xyz");

但这将抛出一个InvalidCastException,如果有对象在层不能被强制转换为PushPin。如果图层包含不同的对象类型,但你只需要PushPins, OfType应该工作:

var item = Layers.Select(x => x.Content).OfType<PushPin>().FirstOrDefault(x => x.Description == "xyz");

Content可以是PushPin以外的东西

var item = Layers.Select(x => x.Content).OfType<PushPin>().FirstOfDefault(c => c.Description == "xyz");

或当所有Content都是PushPin

var item = Layers.Select(x => x.Content).Cast<PushPin>().FirstOfDefault(c => c.Description == "xyz");

。第一个将过滤PushPin类型,第二个将把所有内容转换为PushPin