2

我有一个私有静态函数,它有一个字符串参数和一个类型参数。我将这些传递给我的代码。但是,我专注于一个特定领域。

这是我的功能:

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

我正在尝试将类型传递给 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

扩展 Guffa 的答案。

您还可以通过选择 的非泛型方法重载来修复错误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 回答
-1

当您拥有实际类型时,您只能将类型作为泛型参数传递。您应该重构您的方法以改用泛型类型参数:

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;
}
于 2015-03-27T12:30:42.657 回答