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