2

文字列パラメーターと Type パラメーターを持つプライベートな静的関数があります。これらを自分のコードに渡しています。しかし、私は 1 つの特定の領域に追いついています。

これが私の機能です:

private static object GetCSVRecords(string path, Type t)
{
    using (var txtReader = new StreamReader(path))
    {
        var csv = new CsvReader(txtReader);
        var recordList = csv.GetRecords<t>();
    }
    return recordList;
}

Type を GetRecords<> に渡そうとしています。私が得ているエラーは言うCannot resolve symbol 't'。私は何を間違っていますか?

4

4 に答える 4

3

問題は、t(ジェネリック呼び出しで必要な) 型ではなく、Typeオブジェクトへの参照であることです。

メソッドをジェネリックにすることができます:

private static object GetCSVRecords<T>(string path)
{
    using (var txtReader = new StreamReader(path))
    {
        var csv = new CsvReader(txtReader);
        var recordList = csv.GetRecords<T>();
        return recordList;
    }
}

補足:using変数が宣言されているブロック内で値を返す必要があります (または、ブロック外の特定の型を使用して宣言します)。

于 2015-03-27T12:30:53.957 に答える
1

グッファの答えを拡張します。

の非ジェネリック メソッド オーバーロードを選択することで、エラーを修正することもできGetRecordsます。これは、既に使用しているメソッド シグネチャにより適しています。

private static object GetCSVRecords(string path, Type t)
{
    using (var txtReader = new StreamReader(path))
    {
        var csv = new CsvReader(txtReader);
        return csv.GetRecords(t);
    }
}

または、それに応じてジェネリック型引数を使用するようにメソッドを変更することもできます。

于 2015-03-27T12:46:18.427 に答える
0

T他の人は、呼び出しているメソッドでジェネリック型を使用すると述べています。Tクラス レベルでも設定できることに注意してください。

class YourClass<T>{

    private static object GetCSVRecords(string path)
    {
        using (var txtReader = new StreamReader(path))
        {
            var csv = new CsvReader(txtReader);
            var recordList = csv.GetRecords<T>();
            return recordList;
        }
    }
}

静的メソッドの場合、次のように呼び出しごとに型を指定する必要があるため、これ以上のことはできません。

YourClass<string>.GetCSVRecords(...);

Tただし、そこに指定しなくても、さまざまなメソッドで同じタイプを使用できます。

ただし、メソッドが静的でない場合は、クラスをインスタンス化するときにタイプを一度設定できます。

var yourObj = new YourClass<string>();
yourObj.GetCSVRecords(...): // Will use string as the type 
yourObj.DoSomethingElse(); // Could hypothetically also use T internally.
于 2015-03-27T12:55:35.597 に答える