С этими классами и интерфейсами ...
List<BaseObject> objects;
class BaseObject
{
public void DoStuff();
}
interface IX
{
public void DoX();
}
interface IY
{
public void DoY();
}
interface IZ
{
public void DoZ();
}
class X : BaseObject, IX { }
class Y : BaseOjbect, IY { }
class Z : BaseObject, IZ { }
class XY : BaseObject, IX, IY { }
Как только вы заполняете ojbect любым Классом , определенным выше
foreach (var o in objects)
{
o.DoStuff();
if (o is IX)
((IX)o).DoX(); //executed on class X and XY
if (o is IY)
((IY)o).DoY(); //excuted on class Y and XY
if (o is IZ)
((IZ)o).DoZ(); //excuted on class Z
}
Это должно делать то, что выищу.
ОБНОВЛЕНО за ваш комментарий.
foreach (var o in objects)
{
o.DoStuff();
if (o is IX and o is IY)
{
// do something different only for XY
}
else if (o is IX)
((IX)o).DoX(); //executed on class X
else if (o is IY)
((IY)o).DoY(); //excuted on class Y
else if (o is IZ)
((IZ)o).DoZ(); //excuted on class Z
}
ОБНОВЛЕНО Нет приведения типов.
Требуется другой интерфейс.(Кроме того, DoStuff () должен быть на всех IX, IY, IZ).
interface IXY : IX, IY { }
// This IXY could be var, but just strongly typing it for example
foreach (IXY o in objects.OfType(IXY)
.Cast<IXY>())
{
o.DoStuff();
o.DoX();
o.DoY();
}
Вы также можете сделать что-нибудь CRAZY , например:
foreach (var obj in objects.OfType<IX>()
.OfType<IY>()
.OfType<IZ>()
.Select(o => new
{
AsIX = (IX)o,
AsIY = (IY)o,
AsIZ = (IZ)o
})
{
obj.AsIX.DoX();
obj.AsIY.DoY();
obj.AsIZ.DoZ();
}