2017-02-09 15 views
0

ジェネリックを使用するメソッドをラッピングしていますが、ジェネリックスを正しく渡す方法を理解できません。ジェネリックを使用する外部メソッドにジェネリックを渡す

LoadAssetのように汎用タイプを受け入れる必要があるFindAssetメソッドがあります。

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をパラメータとして受け取るシグネチャもありますが、このシナリオではオブジェクトを正しくキャストする方法がわかりません。

私はあなただけの、以下のようにTを渡す必要があり、私が正しく質問を理解していた場合は、このための使用量は、単にmyclass.FindAsset<Sprite>(assetName);

+2

LoadAssetに渡すタイプでもないのですか? –

+0

別のタイプを使用しない限り、 'T'をもう一度渡すだけですか? – Igor

答えて

6

にすることができる願っています。

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> 

あなたは一般的な制約を必要としますが、LINQを使用してコードを短くすることができますように思えhttps://msdn.microsoft.com/en-us/library/d5x73970.aspx

0

:ここに詳細情報を参照してください

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; 
} 
関連する問題