2014-09-04 119 views
2

我有以下的接口定义的接口:在列表中选择项目匹配

public interface IStep 
{ 
    string Name { get; set; } 
} 

public interface IStepBuildDataSet : IStep 
{ 
    DataSet Data { get; set; } 
} 

public interface IStepBuildFile : IStep 
{ 
    byte File { get; set; } 
} 

我有一个使用这些接口代码:

public List<IStep> Steps { get; set; } 

public void RunJob() 
{ 
    // pseudo code, need to update: 
    IStepBuildDataSet buildDataSet = Steps.Single(s => s is IStepBuildDataSet); 
    IStepBuildFile buildFile = Steps.Single(s => s is IStepBuildFile); 

    // call methods on Steps 
} 

什么是正确的语法来取代伪码?我想在实现certian接口的列表中找到步骤。列表中只会有一个。

+4

该代码是正确的,你只需要强制转换结果:'Steps.Single(S => s是IStepBuildDataSet)作为IStepBuildDataSet' – 2014-09-04 23:16:54

+0

有道理,它返回一个ISTEP。如果您将其作为答案发布,我会将其标记为正确。谢谢。 – Josh 2014-09-04 23:20:17

+0

CSharpie的答案有同样的效果,但LINQier,我会去那个。它有使过滤器更加明确的好处。 – 2014-09-05 00:26:03

回答

7

你可以使用OfType使它升技吸尘器这样的:

IStepBuildDataSet buildDataSet = Steps.OfType<IStepBuildDataSet>().Single(); 
IStepBuildFile buildFile = Steps.OfType<IStepBuildFile>().Single(); 

注意,你不需要投的结果,因为OfType会替你。

+1

好的方法,比我的表达更清洁。 – Josh 2014-09-04 23:22:18

+0

这太棒了。我甚至不知道OfType存在! – 2015-10-21 23:22:08

0

您有IStep的列表,因此列表中可能有不止一种不同类型的Istep对象。所以最好在foreach循环中完成。

foreach(IStepBuildDataSet buildDataSet in Steps.OfType<IStepBuildDataSet>()) 
{ 
    //do something here. 

} 

foreach(IStepBuildFile buildFile in Steps.OfType<IStepBuildFile>()) 
{ 
    //do something here. 

} 
+0

函数Single()存在的原因。 – CSharpie 2014-09-05 06:48:50