C#中的匿名标记接口?

C#中的匿名标记接口?,c#,marker-interfaces,C#,Marker Interfaces,我想知道是否可以在C#中本地创建标记接口,例如在foreach循环中 假设我们有游戏组件,它们应该调用HandleInput和Update方法。这些方法分别在相应的接口IUpdateable和IInputHandler中定义。当然,我们可以这样做一个常规的foreach循环: foreach (var component in Components) { if (component.Enabled) component.Up

我想知道是否可以在C#中本地创建标记接口,例如在foreach循环中

假设我们有游戏组件,它们应该调用HandleInput和Update方法。这些方法分别在相应的接口IUpdateable和IInputHandler中定义。当然,我们可以这样做一个常规的foreach循环:

foreach (var component in Components)
        {
            if (component.Enabled)
                component.Update(gameTime);

            if (component.Litsening)
                component.HandleInput(gameTime, InputManager);
        }
但是,如果有一种方法可以指定iterationvariables的类型是由IUpdateable和IInputHandler构成的临时标记接口,那将是非常好的:

foreach ((IInputHandler, IUpdateable) component in Components)
        {
            if (component.Enabled)
                component.Update(gameTime);

            if (component.Litsening)
                component.HandleInput(gameTime, InputManager);
        }
这是否可能,是否更可取?就我个人而言,我认为它很优雅。 //谢谢,Philip Shield为什么不:

foreach (var component in Components.OfType<IUpdateable>())        
  if (component.Enabled)
    component.Update(gameTime);

foreach (var component in Components.OfType<IInputHandler>())
  if (component.Litsening)
    component.HandleInput(gameTime, InputManager);
foreach(Components.OfType()中的var组件)
如果(组件已启用)
组件更新(游戏时间);
foreach(Components.OfType()中的var组件)
if(组件Litsening)
HandleInput(游戏时间,InputManager);
为什么不:

foreach (var component in Components.OfType<IUpdateable>())        
  if (component.Enabled)
    component.Update(gameTime);

foreach (var component in Components.OfType<IInputHandler>())
  if (component.Litsening)
    component.HandleInput(gameTime, InputManager);
foreach(Components.OfType()中的var组件)
如果(组件已启用)
组件更新(游戏时间);
foreach(Components.OfType()中的var组件)
if(组件Litsening)
HandleInput(游戏时间,InputManager);
怎么样

var componentsWeDesire = Components.Where(c => typeof(IInputHandler).IsAssignableFrom(c.GetType()) 
                                               || typeof(IUpdateable).IsAssignableFrom(c.GetType());

foreach(var component in componentsWeDesire)
{
    // ...
}
怎么样

var componentsWeDesire = Components.Where(c => typeof(IInputHandler).IsAssignableFrom(c.GetType()) 
                                               || typeof(IUpdateable).IsAssignableFrom(c.GetType());

foreach(var component in componentsWeDesire)
{
    // ...
}
C#不允许这种构造。即使它确实允许您创建一个临时的匿名接口,也要记住C#是一种强类型语言。因此,如果存在此IComposite接口,则实际的组件类型不会实现它。UpdateableComponent只实现IComposite的一半,而ListingComponent只实现另一半

如果您讨论的是一个场景,其中组件始终实现两个接口-在这种情况下,您应该创建第三个接口-而不是匿名动态构造-将这两个接口扩展到单个组合整体:

public interface IGameComponent : IUpdateable, IInputHandler
{ }
C#支持接口的多重继承,因此您可以在编译时创建这些组合。

C#不允许这种构造。即使它确实允许您创建一个临时的匿名接口,也要记住C#是一种强类型语言。因此,如果存在此IComposite接口,则实际的组件类型不会实现它。UpdateableComponent只实现IComposite的一半,而ListingComponent只实现另一半

如果您讨论的是一个场景,其中组件始终实现两个接口-在这种情况下,您应该创建第三个接口-而不是匿名动态构造-将这两个接口扩展到单个组合整体:

public interface IGameComponent : IUpdateable, IInputHandler
{ }

C#支持接口的多重继承,因此您可以在编译时创建这些组合。

使用第二种情况的好处/意义是什么?您试图解决什么问题?使用第二种情况的好处/意义是什么?您试图解决什么问题?我甚至会将其微调为:
Components.OfType()。在哪里(c=>c.Enabled.ToList().ForEach(c=>Update(gametime));
@Avner我想说这是一个编码风格和可读性的问题。我甚至会将它微调为:
Components.OfType().Where(c=>c.Enabled.ToList().ForEach(c=>Update(gametime));
@Avner我想说这是一个编码风格和可读性的问题。