我正在制作XNA内容加载器:
public object[] LoadIt(KeyValuePair<Type,string>[] resources, ContentManager content)
{
object[] result = new object[resources.Length];
for(int i=0;i<result.Length;i++)
{
result[i] = content.Load<resources[i].Key>(resources[i].Value);
}
return result;
}
但很明显你不允许从变量中传递泛型类型,那么我该如何解决呢?
如果你将类型作为泛型传递给方法本身,那么我仍然需要调用方法的对象从变量中获取类型,因为生成一个文件声明要加载的文件和来自字符串那个文件,我需要传递文件的类型和路径来加载
答案 0 :(得分:1)
这是针对您的问题的XNA特定答案,但您不需要这样做!
你可以替换它:
content.Load<resources[i].Key>(resources[i].Value);
有了这个:
content.Load<object>(resources[i].Value);
XNA从内容文件本身在运行时自行计算出适当的类型。通用只是为了方便和类型安全。
如果您想自己验证加载对象的类型,可以执行以下操作:
if(result[i].GetType() != resources[i].Key
&& !result[i].GetType().IsSubclassOf(resources[i].Key))
{
throw new InvalidOperationException();
}
当然,有人可能会问为什么要制作“内容加载器”?我没有足够的信息知道你在做什么 - 但它看起来就像它可能是不必要的。 XNA的ContentManager
已经实现了(customisable)缓存已加载的对象 - 因此您可能(并且应该)直接使用它。
答案 1 :(得分:0)
你根本不能,因为类型不是编译时常量。
可以做的是使用反射而不会出现问题,因为您只需要object
作为返回值:
public object[] LoadIt(KeyValuePair<Type,string>[] resources, ContentManager content)
{
object[] result = new object[resources.Length];
for(int i=0;i<result.Length;i++)
{
result[i] = content
.GetType()
.GetMethod("Load")
.MakeGenericMethod(resources[i].Key)
.Invoke(content, new object[] { resources[i].Value });
}
return result;
}