2016-06-21 6 views
0

私はいくつかのサンプルを保持するクラスFrameを持っています。これらのサンプルを別の数値型に変換するメソッドAsTypeが必要です。ジェネリック型を受け取って返すメソッド - それを行う方法?

これを試しましたが、The type or namespace 'TargetType' cannot be foundが原因で機能しません。また、なぜそれがうまくいかなかったのか、それについて考える正しい方法を見つけ出して、それを正しく得ることができたのか、少し迷っています。

public class Frame<T> 
{ 
    public T[] Samples { get; protected set; } 

    public Frame(IEnumerable<T> Samples) 
    { 
     Samples = Samples.ToArray(); 
    } 

    public Frame<TOut> AsType(Type TOut) 
    { 
     // line below doesn't work 
     return new Frame<TOut>(Samples.Select(s => (TOut)s)); 
    } 
} 
+1

「か何かを」本当にそれが、できるGoogleで検索することができませんか?実際の例外メッセージを調べると、メソッド定義にジェネリック型のパラメータがないことがわかります: 'AsType <' ** 'TOut' **'>() '。 – CodeCaster

答えて

4

このためメソッドのパラメータは必要ありませんが、ジェネリックパラメータ

     //don't miss this parameter! 
public Frame<TOut> AsType<TOut>() 
{ 
    return new Frame<TOut>(Samples.Select(s => (TOut)s)); 
} 

TOutは、一般的なパラメータなので、余分なタイプのパラメータの必要がありません。ただし、このメソッドを呼び出すタイプの明示的な変換が存在する必要があります。そうでない場合は、(TOut)sInvalidCastExceptionをスローします。

そして、あなたはCast<>拡張子使用してコードを変更することができます:

public Frame<TOut> AsType<TOut>() 
{ 
    return new Frame<TOut>(Samples.Cast<TOut>()); 
} 
+0

2番目の「下の行が機能しません」という行を削除しました。ありがとう、今私はそれを得た! – heltonbiker

関連する問題