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