繁体   English   中英

从参数获取泛型

[英]Get generic type from parameter

我正在制作XNA contentloader:

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;
}

但显然您不允许从变量传递泛型,那么我该如何解决呢?

另外,如果您将类型作为通用类型传递给方法本身,那么我仍然需要调用该方法的对象来从变量获取类型,因为要制作一个声明要加载的文件的文件以及该文件的字符串,我需要传递要加载的文件的类型和路径

这是针对您的问题的特定于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();
}

当然,有人会问为什么要制作“ contentloader”? 我没有您正在做的事情的足够信息-但似乎没有必要。 XNA的ContentManager已经实现了( 可自定义的 )已加载对象的缓存-因此,您可能(并且应该)直接使用它。

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

可以做的是使用反射而不会出现问题,因为您只需要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;
}

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM