基于非编译时变量的返回类型
Returning type based on non-compile time variables
首先我要说我不知道这是否是加载资源的最佳方法,但现在我的资源管理器已在 LoadContent 向其提交内容,然后刷新其资源并存储它们在列表中。然后在游戏代码中的任何一点,我都可以调用查询资源,它 return 是我设计为 ResourceBufferElement 的类型,它在任何给定时间都包含 xna 的所有可能类型的内容,但只有其中一个不为空。
所以
//All of this is valid but only .Texture returns a non-null value
QueryResource("texture").Texture
QueryResource("texture").Model
QueryResource("texture").SpriteFont
所以我想知道是否有一种方法可以让我只调用 QueryResource("") 并且它隐式 return 它代表的值。
所以我想说
//At LoadContent
SubmitResource("texture", typeof(Texture2D))
SubmitResource("model", typeof(Model))
//Then at calling I want to say
Texture2D tex = QueryResource("texture")
or
Model mod = QueryResource("model")
//Instead of saying this
Texture2D tex = QueryResource("texture").Texture
or
Model mod = QueryResource("model").Model
注意:我已经存储了类型,所以在提交时我说
SubmitResource("", typeof(Texture2D))
and ResourceBufferElement keeps the Type for later use
你可以这样做:
public T QueryResource<T>(string resourceName)
{
if (T is Texture)
return (T)QueryResource(resourceName).Texture;
else if (T is Model)
return (T)QueryResource(resourceName).Model;
else if (T is SpriteFont)
return (T)QueryResource(resourceName).SpriteFont;
return default(T);
}
这将按照您的意愿工作:
Texture text = QueryResource<Texture>("Resource");
首先我要说我不知道这是否是加载资源的最佳方法,但现在我的资源管理器已在 LoadContent 向其提交内容,然后刷新其资源并存储它们在列表中。然后在游戏代码中的任何一点,我都可以调用查询资源,它 return 是我设计为 ResourceBufferElement 的类型,它在任何给定时间都包含 xna 的所有可能类型的内容,但只有其中一个不为空。
所以
//All of this is valid but only .Texture returns a non-null value
QueryResource("texture").Texture
QueryResource("texture").Model
QueryResource("texture").SpriteFont
所以我想知道是否有一种方法可以让我只调用 QueryResource("") 并且它隐式 return 它代表的值。
所以我想说
//At LoadContent
SubmitResource("texture", typeof(Texture2D))
SubmitResource("model", typeof(Model))
//Then at calling I want to say
Texture2D tex = QueryResource("texture")
or
Model mod = QueryResource("model")
//Instead of saying this
Texture2D tex = QueryResource("texture").Texture
or
Model mod = QueryResource("model").Model
注意:我已经存储了类型,所以在提交时我说
SubmitResource("", typeof(Texture2D))
and ResourceBufferElement keeps the Type for later use
你可以这样做:
public T QueryResource<T>(string resourceName)
{
if (T is Texture)
return (T)QueryResource(resourceName).Texture;
else if (T is Model)
return (T)QueryResource(resourceName).Model;
else if (T is SpriteFont)
return (T)QueryResource(resourceName).SpriteFont;
return default(T);
}
这将按照您的意愿工作:
Texture text = QueryResource<Texture>("Resource");