使用Linq按具体类型获取IList项
本文关键字:获取 IList 类型 Linq 使用 | 更新日期: 2023-09-27 18:27:12
所以我有以下内容:
public IList<ISignupStepViewModel> Steps { get; set; }
ISignupStepViewModel的具体实现示例如下:
public class SignupStepBillingViewModel : ISignupStepViewModel
public class SignupStepPricingViewModel : ISignupStepViewModel
我用实现ISignupStepViewModel
的具体类初始化Steps
,具体类如下:
Steps = typeof (ISignupStepViewModel)
.Assembly
.GetTypes()
.Where(t => !t.IsAbstract && typeof (ISignupStepViewModel).IsAssignableFrom(t))
.Select(t => (ISignupStepViewModel) Activator.CreateInstance(t))
.ToList();
我现在想用Linq在IList<ISignupStepViewModel> Steps
中获得一个特定的项目,比如:
var billingStep = (SignupStepBillingViewModel)signupObj.Steps.FirstOrDefault(t => typeof(t) == SignupStepBillingViewModel);
有办法做到这一点吗?目前,我在SignupStepBillingViewModel上收到错误"类名此时无效"(粗体:)
(SignupStepBillingViewModel)signupObj.Steps.FirstOrDefault(t=>typeof(t)==SignupStepBillingViewModel);
尝试使用关键字:is而不是:typeof(t)==SignupStepBillingViewModel
var billingSteps = signupObj.Steps.Where(t => t is SignupStepBillingViewModel).Select(t => (SignupStepBillingViewModel)t).ToList();
试试这个:
signupObj.Steps.FirstOrDefault(t => t.GetType() == typeof(SignupStepPricingViewModel)) as SignupStepPricingViewModel;
感谢所有的帮助,@JonSkeet在评论中建议的最简单的解决方案是:
var billingStep = Steps.OfType<SignupStepBillingViewModel>().First();
此代码为
Steps.Select(t => typeof(t) == SignupStepBillingViewModel);
将生成一个bool
值的集合,然后尝试将其大小写到对象中。试试这个:
var billingStep = (SignupStepBillingViewModel)Steps.FirstOrDefault(t => typeof(t) == SignupStepBillingViewModel);