#c# #api #async-await
Вопрос:
Обычно я бы создал универсальный объект в своем базовом контроллере, а затем импортировал его в службу, например:
public async Task<IActionResult> CreateAsync(TEntity entity)
{
entity = await _service.CreateAsync(entity);
return Ok(entity);
}
Что я ХОЧУ сделать, так это импортировать файл csv, получить доступ к универсальному объекту из инструкции HttpPost и заполнить его содержимым файла, а затем обработать его следующим образом:
public async Task<IActionResult> CreateAsyncCSV(string filePath)
{
int i = 0;
using (var reader = new StreamReader(filePath))
{
while (!reader.EndOfStream)
{
var line = reader.ReadLine();
var values = line.Split(';');
var entity = new HeaderText();
PropertyInfo[] properties = typeof(TEntity).GetProperties();
foreach (PropertyInfo property in properties)
{
property.SetValue(entity, values[i]);
i = 1;
}
}
}
return Ok();
}
Но я не могу найти способ создать пустую сущность — возможно ли это вообще или я должен просто писать выделенную конечную точку каждый раз, когда я хочу это сделать?
Ответ №1:
Если под созданием пустой сущности вы подразумеваете создание нового экземпляра сущности, вы можете использовать общее ограничение where TEntity : new()
, которое требует только наличия конструктора без параметров для каждого типа сущности, а затем вы можете написать new TEntity()
, чтобы иметь пустой экземпляр сущности.
Кроме того, поскольку вы в основном хотите читать CSV в объекты C#, вы можете использовать библиотеки с открытым исходным кодом, например, CSV-помощник, который имеет встроенную поддержку для чтения CSV в записи класса C#.
Комментарии:
1. Я могу создать новый контроллер только для функции и использовать общее ограничение — есть ли что-нибудь, что можно сделать на уровне задачи? Спасибо за такой быстрый и полный ответ!
2. Никаких проблем 🙂 Что вы имеете в виду под «на уровне задачи»?
3. В инструкции CreateAsync инструкция
4. Мой первоначальный ответ также применим к методу CreateAsync — он должен иметь общее ограничение и может использовать вспомогательную библиотеку CSV или вызывать ваш собственный код для чтения файлов CSV.