1

我想知道是否可以在 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);
        }

但是,如果有一种方法可以指定迭代变量的类型是由 IUpdateable 和 IInputHandler 构成的临时标记接口,那将是非常简洁的:

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

            if (component.Litsening)
                component.HandleInput(gameTime, InputManager);
        }

这可能吗,会更好吗?我个人认为它很优雅。// 谢谢,菲利普·希尔德

4

3 回答 3

4

为什么不:

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);
于 2012-02-28T08:54:39.473 回答
1

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

如果您正在谈论您的组件始终实现两个接口的场景 - 那么,在这种情况下,您应该创建第三个接口 - 而不是匿名的即时构造 - 将这两个接口扩展为单个复合整体:

public interface IGameComponent : IUpdateable, IInputHandler
{ }

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

于 2012-02-28T09:20:40.040 回答
0

怎么样

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

foreach(var component in componentsWeDesire)
{
    // ...
}
于 2012-02-28T08:58:11.723 回答