Я хотел бы сделать универсальный метод для импорта данных в мое приложение.
Например, скажем, у меня есть:
private static async Task<int> ImportAccount(string filename)
{
var totalRecords = await GetLineCount(filename);
var ctx = new AccountContext();
var count = 0;
var records = 0;
using (var stream = File.Open(filename, FileMode.Open, FileAccess.Read, FileShare.ReadWrite))
{
using (var reader = new StreamReader(stream, Encoding.UTF8))
{
string line;
while ((line = await reader.ReadLineAsync()) != null)
{
var data = line.Split('\t');
var acc = new Account(data);
await ctx.Accounts.AddAsync(acc);
// need this to avoid using all the memory
// maybe there is a smarter or beter way to do it
// with 10k it uses about 500mb memory,
// files have million rows+
if (count % 10000 == 1)
{
records += result = await ctx.SaveChangesAsync();
if (result > 0)
{
ctx.Dispose();
ctx = new AccountContext();
}
}
count++;
}
}
}
await ctx.SaveChangesAsync();
ctx.Dispose();
return records;
}
В приведенном выше примере я импортирую данные изфайл с разделителями табуляции в базу данных Accounts.
Затем у меня есть свойства, земли и множество других баз данных, которые мне нужно импортировать.
Вместо того, чтобы создавать метод для каждой базы данных, например:Выше я хотел бы сделать что-то вроде:
internal static readonly Dictionary<string, ??> FilesToImport = new Dictionary<string, ??>
{
{ "fullpath to file", ?? would be what I need to pass to T }
... more files ...
};
private static async Task<int> Import<T>(string filename)
Где T будет рассматриваемой БД.
У всех моих классов есть одна общая черта, у всех них есть конструктор, которыйзанимает string[] data
.
Но я понятия не имею, как я мог бы сделать метод, который я был бы в состоянии принять:
private static async Task<int> Import<T>(string filename)
И затем смог бы сделать:
var item = new T(data);
await ctx.Set<T>().AddAsync(item);
И если я правильно помню, я не смог бы создать экземпляр T с параметром.
Как я могу создать этот общий метод Import и можно ли его достичь?