使用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);

使用Linq按具体类型获取IList项

尝试使用关键字: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);