2013-06-25 3 views
1

Im делая 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; 
} 

но apparenty вы не разрешается передавать общий тип из переменной, так как я решить эту проблему тогда?

также, если вы передаете тип как общий для самого метода, тогда мне все еще нужен объект, вызывающий метод, чтобы получить тип от переменной, так как плохо делать файл, который объявляет файлы для загрузки, и из строк из этого файла, мне нужно передать тип и путь к файлам для загрузки

+0

Один из способов - вызвать метод с использованием отражения: http://stackoverflow.com/a/232621/869621 –

+0

Можете ли вы показать метод загрузки класса ContentManager? –

+0

Метод загрузки: http://msdn.microsoft.com/en-us/library/bb197848.aspx – Andre

ответ

-1

Попробуйте

Edit: Это будет работать только для типа T.

public object[] LoadIt<T>(KeyValuePair<T,string>[] resources, ContentManager content) 
{ 
    object[] result = new object[resources.Length]; 
    for(int i=0;i<result.Length;i++) 
    { 
     result[i] = content.Load<T>(resources[i].Value); 
    } 
    return result; 
} 
+0

Как я уже сказал, тогда мне все равно нужно, чтобы объект вызывал сам метод, чтобы определить тип – MooshBeef

+0

'content.Load ' не будет работать –

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

Это 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's ContentManager уже реализует (customisable) кеширование загруженных объектов - так что, скорее всего, вы сможете (и должны) просто использовать его напрямую.

+0

Я думал, что его рассуждения могут для динамического содержимого для динамического объекта. –

+0

@ShahroozJefri [Revenge] (http://stackoverflow.com/a/17638864/165500) downvote на случайном ответе моего? Оставайтесь классными. –

+0

Нет, я не люблю тебя.так что проголосовали –