2017-02-09 2 views
0

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

У меня есть метод FindAsset, который должен принимать общий тип, как и у LoadAsset.

public T FindAsset<T>(string assetName) { 
    T match; 

    foreach (AssetBundle bundle in assets) { 
     if (bundle.Contains(assetName)) { 
      match = bundle.LoadAsset<???>(assetName); 
     } 
    } 

    return match; 
} 

Я просто не знаю, как я могу правильно передать общий вид на LoadAsset. Этот метод также имеет подпись, которая принимает параметр Type в качестве параметра, но в этом сценарии я не вижу способа правильно лить объект.

Я надеюсь, что использование этого может быть просто myclass.FindAsset<Sprite>(assetName);

+2

Разве это не тот тип, который вы хотите передать LoadAsset? –

+0

Просто пропустите 'T' еще раз, если вы не хотите использовать другой тип? – Igor

ответ

6

Если я понять вопрос правильно, вам просто нужно пройти T, как показано ниже.

public T FindAsset<T>(string assetName) { 
    T match; 

    foreach (AssetBundle bundle in assets) { 
     if (bundle.Contains(assetName)) { 
      match = bundle.LoadAsset<T>(assetName); 
     } 
    } 

    return match; 
} 
+0

Хорошо, я пробовал это, но неправильно понял ошибку. Я предполагаю, что это нормально, но в моем случае метод LoadAsset не является полностью общим: 'Тип 'T' не может использоваться как параметр типа 'T' в универсальном типе или методе 'UnityEngine.AssetBundle.LoadAsset (строка). Нет никакого преобразования параметров бокса или типа из 'T' в 'UnityEngine.Object'' – helion3

3

Если ~ T (Тот же тип, который будет использоваться родового родительского класса) не тот же тип вы хотите передать LoadAsset Затем вы можете передать несколько дженерики:

public T FindAsset<T,U>(string assetName) {... 

LoadAsset<U> 

Смотрите подробнее здесь: https://msdn.microsoft.com/en-us/library/d5x73970.aspx

0

Похоже, вам нужно общее ограничение и вы можете сделать код короче, используя LINQ:

public T FindAsset<T>(string assetName) 
    where T : UnityEngine.Object 
{ 
    T bundle = assets.FirstOrDefault(bundle => bundle.Contains(assetName)); 

    return (bundle != null) ? bundle.LoadAsset<T>(assetName) : null; 
} 
Смежные вопросы