【问题标题】:Get generic type from parameter从参数获取泛型类型
【发布时间】:2013-06-25 19:50:18
【问题描述】:

我正在制作一个 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;
}

但是显然你不允许从变量中传递泛型类型,那么我该如何解决这个问题呢?

如果你将类型作为泛型传递给方法本身,那么我仍然需要调用该方法的对象从变量中获取类型,因为我将创建一个文件来声明要加载的文件和来自该文件,我需要传递要加载的文件的类型和路径

【问题讨论】:

标签: c# generics xna


【解决方案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) 加载对象的缓存 - 因此您可能(并且应该)直接使用它。

【讨论】:

  • 我认为他的推理可能是针对动态对象的动态内容。
  • @ShahroozJefri Revenge 否决我的随机答案?保持优雅。
【解决方案2】:

你根本不能,因为类型不是编译时常量。

可以做的是毫无问题地使用反射,因为你只需要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;
}

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2013-08-15
    • 2021-07-10
    • 1970-01-01
    • 2018-07-26
    • 2011-09-03
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多