【发布时间】:2011-01-25 06:53:08
【问题描述】:
我正在开发一个项目(使用 Xna),该项目基本上读取 XML 内容文件以创建处理各种类型输入事件的事件处理程序。 XML 文件如下所示:
<InputMapping>
<InputType>Microsoft.Xna.Framework.Input.Keys, Microsoft.Xna.Framework, Version=3.1.0.0, Culture=neutral, PublicKeyToken=6d5c3888ef60e27d</InputType>
<Combination>Up W</Combination>
<CombinationType>Any</CombinationType>
<Handlers>
<Handler>MoveUp</Handler>
<Handler>ScrollMenuUp</Handler>
</Handlers>
</InputMapping>
“MoveUp”和“ScrollMenuUp”是我希望能够处理按下“Up”和/或“W”键时引发的事件的两个方法的名称,并且我已经标记了它们的包含类有一个自定义属性这样说。生成的“输入地图”被添加到游戏中每帧更新的输入地图列表中。当满足输入组合(可能是鼠标按钮单击、滚轮移动、鼠标移动等,取决于输入映射的类型)时,将引发事件并由 XML 中列出的方法处理文件。
为了找到 XML 文件引用的方法,我最初的计划是使用反射迭代执行程序集中的导出类型,找到应用了我的自定义属性的静态类,并存储它们的所有公共静态与 Dictionary 中相关事件的委托签名匹配的方法,以它们的名称为键,以供后续输入映射加载引用相同的方法使用。对于发布版本,我会将此方法列表写入文件以大幅减少加载时间,但对于调试,我希望此可用事件处理程序列表与我的修订保持同步。
这非常有效,而且出乎意料地比我预期的耗时少。但是,我不知道如何扩展这种方法以包含泛型委托:我有一个名为 InputHandler<T> 的泛型委托,如下所示:
public delegate void InputHandler<T>(T input, GameTime gameTime) where T : struct;
我可以很好地获取委托的签名,但我的问题是我不知道如何获取由泛型类型构造的类,这些泛型类型包含可能由InputHandler<T> 表示的方法。更简单地说,我有一个名为 InputHandlers<T> 的类,它看起来像这样:
[MyInputHandlerAttribute]//This tells my XML-loading method to look in this class for event handler candidates
public static class InputHandlers<T>
where T : struct
{
public static void HandleInput<T>(T input, GameTime gameTime)
{
/*
* An input event would be handled here.
* The type of input event handled would depend entirely on the assembly-qualified
* name provided in the "<InputType>" element of the XML file.
* This kind of non-specific input handling might not make sense, but it has its worthwhile uses:
* serializing input for network transmission
* (using some interface that T would be constrained to implement) is the use I have in mind.
*/
}
}
并且我希望能够在我的 XML 文件中简单地键入 <Handler>HandleInput</Handler> 并找到与从 InputHandlers<T> 构造的类中定义的方法相对应的 MethodInfo,其通用参数对应于我正在寻找的事件句柄(与事件的InputHandler<T> 声明中使用的 T 类型相同,我只能从 XML 文件中列出的程序集限定名称派生)。
我知道(根据 C# 规范)在运行时不存在开放类型,那么如何获取从我的泛型类构造的封闭类型的列表?
【问题讨论】:
标签: generics reflection xna