2015-03-27 8 views
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; 
} 

Я пытаюсь передать тип в GetRecords <>. Ошибка, которую я получаю, говорит Cannot resolve symbol 't'. Что я делаю не так?

+0

Может ли вы изменить свой метод к родовым один? GetCSVRecords (строка пути) – Biscuits

+0

Возможный дубликат [Как использовать отражение для вызова общего метода?] (Http://stackoverflow.com/questions/232535/how-to-use-reflection-to-call-generic-method) –

ответ

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

Проблема заключается в том, что 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; 
    } 
} 

Side Примечание: Вы должны вернуть значение внутри using блока, в котором объявлена ​​переменная (или объявить его с помощью определенного типа за пределами блока).

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

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

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. 
Смежные вопросы