Skip to main content
 首页 » 编程设计

C# foreach 在一个接口(interface)的集合上

2024年01月13日39sky-heaven

我想知道 C#/LINQ 是否内置了任何功能来简化以下操作:

foreach(var item in collection) 
{ 
    if (item.GetType() == typeof(Type1) 
         DoType1(item as Type1); 
    else if (item.GetType() == typeof(Type2)) 
         DoType2(item as Type2); 
    ... 
} 

类似于以下内容:

collection.ForEachType(Type1 item => DoType1(item), Type2 item => DoType2(item)); 

我意识到以下内容很接近:

collection.OfType<Type1>.ToList().Foreach(item => DoType1(item)); 
collection.OfType<Type2>.ToList().Foreach(item => DoType2(item)); 

但是当代码依赖于集合的顺序时它不起作用。

请您参考如下方法:

我首先要看的是多态性;我可以改用虚拟方法和 item.DoSomething() 吗?

接下来我要看的是枚举鉴别器,即

switch(item.ItemType) { 
    case ItemType.Foo: ... 
    case ItemType.Bar: ... 
} 

(并将鉴别器添加到公共(public)接口(interface)/基类)

如果类型可以是任何,那么 4.0 有一个技巧;如果您为每个重载调用相同的方法,您可以让 dynamic 担心选择它:

dynamic x = item; 
DoSomething(x);