使用多个类/接口列出过滤

JBe*_*rer 5 c# generics interface

基本上我有一个对象列表,其中每个对象可能实现一组不同的接口:

List<BaseObject> objects;

class BaseObject
{
  public void DoStuff();
}

interface IX
{
  void DoX();
}

interface IY
{
  void DoY();
}

interface IZ
{
  void DoZ();
}
Run Code Online (Sandbox Code Playgroud)

我想写这样的东西:

foreach(var obj in objects.OfType<BaseObject and IX>)
{
  obj.DoStuff();
  obj.DoX();
}
Run Code Online (Sandbox Code Playgroud)

(例如,我为BaseObject和IX类型的对象执行特定的算法,而不必在那里进行类型转换)

可以用C#做​​吗?什么是最优雅的解决方案?

我可以做这个:

foreach(var obj in objects.OfType<IX>)
{
  var baseobj = (BaseObject)obj.DoStuff();
  obj.DoX();
}
Run Code Online (Sandbox Code Playgroud)

但我发现它很难看.

我可能需要将特定操作应用于实现说接口IX和接口IZ的类型.

foreach(var obj in objects.OfType<BaseType and IX and IZ>)
{
  obj.DoStuff();
  obj.DoX();
  obj.DoZ();
}
Run Code Online (Sandbox Code Playgroud)

Jef*_*ata 4

一种可能的方法是使用dynamic

foreach(var xz in objects.Where(o => o is IX && o is IZ).Select(o => (dynamic)o))
{
    xz.DoStuff();
    xz.DoX();
    xz.DoZ();   
}
Run Code Online (Sandbox Code Playgroud)

当然,如果你不想使用,你仍然可以强制转换dynamic

foreach(var xz in objects.Where(o => o is IX && o is IZ))
{
    xz.DoStuff();
    ((IX)xz).DoX();
    ((IZ)xz).DoZ(); 
}
Run Code Online (Sandbox Code Playgroud)