Доступ к универсальному объекту из конечной точки API

#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.