C# 使用Linq按具体类型获取IList项
因此,我有以下几点:C# 使用Linq按具体类型获取IList项,c#,asp.net-mvc,linq,asp.net-mvc-4,C#,Asp.net Mvc,Linq,Asp.net Mvc 4,因此,我有以下几点: public IList<ISignupStepViewModel> Steps { get; set; } Steps = typeof (ISignupStepViewModel) .Assembly .GetTypes() .Where(t => !t.IsAbstract && typeof (ISignupStepViewModel).IsAssignabl
public IList<ISignupStepViewModel> Steps { get; set; }
Steps = typeof (ISignupStepViewModel)
.Assembly
.GetTypes()
.Where(t => !t.IsAbstract && typeof (ISignupStepViewModel).IsAssignableFrom(t))
.Select(t => (ISignupStepViewModel) Activator.CreateInstance(t))
.ToList();
我使用具体的类初始化步骤
,这些类实现了ISignupStepViewModel
,如下所示:
public IList<ISignupStepViewModel> Steps { get; set; }
Steps = typeof (ISignupStepViewModel)
.Assembly
.GetTypes()
.Where(t => !t.IsAbstract && typeof (ISignupStepViewModel).IsAssignableFrom(t))
.Select(t => (ISignupStepViewModel) Activator.CreateInstance(t))
.ToList();
现在,我想使用Linq在IList步骤中获得一个特定项,例如:
var billingStep = (SignupStepBillingViewModel)signupObj.Steps.FirstOrDefault(t => typeof(t) == SignupStepBillingViewModel);
有办法做到这一点吗?目前,我在SignupStepBillingViewModel上以粗体显示错误“此时类名无效”:
(SignupStepBillingViewModel)signupObj.Steps.FirstOrDefault(t=>typeof(t)=SignupStepBillingViewModel) 此代码
Steps.Select(t => typeof(t) == SignupStepBillingViewModel);
将生成一个bool
值的集合,然后尝试对对象进行大小写。试试这个:
var billingStep = (SignupStepBillingViewModel)Steps.FirstOrDefault(t => typeof(t) == SignupStepBillingViewModel);
此代码
Steps.Select(t => typeof(t) == SignupStepBillingViewModel);
将生成一个bool
值的集合,然后尝试对对象进行大小写。试试这个:
var billingStep = (SignupStepBillingViewModel)Steps.FirstOrDefault(t => typeof(t) == SignupStepBillingViewModel);
此代码
Steps.Select(t => typeof(t) == SignupStepBillingViewModel);
将生成一个bool
值的集合,然后尝试对对象进行大小写。试试这个:
var billingStep = (SignupStepBillingViewModel)Steps.FirstOrDefault(t => typeof(t) == SignupStepBillingViewModel);
此代码
Steps.Select(t => typeof(t) == SignupStepBillingViewModel);
将生成一个bool
值的集合,然后尝试对对象进行大小写。试试这个:
var billingStep = (SignupStepBillingViewModel)Steps.FirstOrDefault(t => typeof(t) == SignupStepBillingViewModel);
尝试使用关键字:is
而不是:typeof(t)=SignupStepBillingViewModel
尝试使用关键字:is
而不是:typeof(t)=SignupStepBillingViewModel
尝试使用关键字:is
而不是:typeof(t)=SignupStepBillingViewModel
尝试使用关键字:is
而不是:typeof(t)=SignupStepBillingViewModel
试试这个:
signupObj.Steps.FirstOrDefault(t => t.GetType() == typeof(SignupStepPricingViewModel)) as SignupStepPricingViewModel;
试试这个:
signupObj.Steps.FirstOrDefault(t => t.GetType() == typeof(SignupStepPricingViewModel)) as SignupStepPricingViewModel;
试试这个:
signupObj.Steps.FirstOrDefault(t => t.GetType() == typeof(SignupStepPricingViewModel)) as SignupStepPricingViewModel;
试试这个:
signupObj.Steps.FirstOrDefault(t => t.GetType() == typeof(SignupStepPricingViewModel)) as SignupStepPricingViewModel;
感谢所有帮助,@JonSkeet在评论中建议的最简单的解决方案是:
var billingStep = Steps.OfType<SignupStepBillingViewModel>().First();
var billingStep=Steps.OfType().First();
感谢@JonSkeet在评论中建议的所有帮助和最简单的解决方案是:
var billingStep = Steps.OfType<SignupStepBillingViewModel>().First();
var billingStep=Steps.OfType().First();
感谢@JonSkeet在评论中建议的所有帮助和最简单的解决方案是:
var billingStep = Steps.OfType<SignupStepBillingViewModel>().First();
var billingStep=Steps.OfType().First();
感谢@JonSkeet在评论中建议的所有帮助和最简单的解决方案是:
var billingStep = Steps.OfType<SignupStepBillingViewModel>().First();
var billingStep=Steps.OfType().First();
是否也要包括SignupStepBillingViewModel
的子类型?如果是这样的话,of type
就是你的朋友。of type
是泛型的,所以在这种情况下我认为它不可用。@Brian MajoB的答案可以解决这个问题。你想不想包括SignupStepBillingViewModel
的子类型?如果是这样的话,of type
就是你的朋友。of type
是泛型的,所以在这种情况下我认为它不可用。@Brian MajoB的答案可以解决这个问题。你想不想包括SignupStepBillingViewModel
的子类型?如果是这样的话,of type
就是你的朋友。of type
是泛型的,所以在这种情况下我认为它不可用。@Brian MajoB的答案可以解决这个问题。你想不想包括SignupStepBillingViewModel
的子类型?如果是这样的话,of type
就是你的朋友。of type
是泛型的,所以在这种情况下我认为它不可用。@Brian MajoB的答案会解决这个问题。您好,谢谢您的建议,我使用Select而不是FirstOrDefault是一个错误。我更新了我的答案,因为你的答案不起作用。只需使用of type
,如果不可用,你可以使用is
操作符。此外,你的代码没有编译-1,你必须执行t.GetType()==typeof(注册…
),但不要,请参阅我之前的评论。嗨,谢谢你的建议,我使用Select而不是FirstOrDefault是一个错误。我更新了我的答案,因为你的答案不起作用。只需使用of type
,如果不可用,你可以使用is
操作符。此外,你的代码没有编译-1,你必须执行t.GetType()==typeof(注册…
),但不要,请参阅我之前的评论。嗨,谢谢你的建议,我使用Select而不是FirstOrDefault是一个错误。我更新了我的答案,因为你的答案不起作用。只需使用of type
,如果不可用,你可以使用is
操作符。此外,你的代码没有编译-1,你必须执行t.GetType()==typeof(注册…
),但不要,请参阅我之前的评论。嗨,谢谢你的建议,我使用Select而不是FirstOrDefault是一个错误。我更新了我的答案,因为你的答案不起作用。只需使用of type
,如果不可用,你可以使用is
操作符。此外,你的代码没有编译-1,你必须执行t.GetType()==typeof(注册…
,但不要,请参阅我之前的评论。这是正确的答案,感谢@JonSkeet在他的评论中告诉你。这是正确的答案,感谢@JonSkeet在他的评论中告诉你。这是正确的答案,感谢@JonSkeet在他的评论中告诉你。这是正确的答案,感谢@JonSkeet在他的评论中告诉你。只需使用of type
,如果不可用,您可以使用is
运算符。只需使用of type
运算符,如果不可用,您可以使用is
运算符。只需使用of type
运算符,如果不可用,您可以使用is
运算符。只需使用of type
运算符,如果不可用,您可以使用is
操作符。is
比它替换的比较好,但是您可以使用of type
is
比它替换的比较好,但是您可以使用of type
is比它替换的比较好,但是您可以使用of type
is
比它所取代的比较更好,但您可以使用of type
。