我想知道 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);
