2016-09-06 3 views
-1

Я создаю функцию синхронизации между устройством и сервером для большой базы данных. У меня много таблиц листинга (элементы в выпадающем списке/подборщике). Я не хочу писать много кода, и я ищу элегантное решение :)C# общая функция T, где T - строка

На устройстве в SQLite Я определил список таблицы как

public class NameTable : IBusinessEntity { 
     public int Id { get; set; } = 0; 
     public string Description { get; set; } 
    } 

Когда я сохранить в базе данных а новая запись (элемент) Я называю эту функцию

public int SaveItem<T>(T item) where T : IBusinessEntity { 
     lock (locker) { 
      if (item.Id != 0) { 
       database.Update(item); 
       return item.Id; 
      } 
      else { 
       return database.Insert(item); 
      } 
     } 
    } 

Теперь, когда устройство получает новую запись с сервера структура походит

public class SyncResult { 
     public int DeviceId { get; set; } 
     public int ServerId { get; set; } 
     public string TableName { get; set; } 
     public string Description { get; set; } 
    } 

Затем я хочу сохранить (вставить новую запись, если DeviceId == 0 или обновить существующий элемент).

Мой вопрос: как я могу назвать SaveItem где T является TableName от SyncResult?

Заранее спасибо за любую помощь (я могу предложить пиво для этого!)


SaveItem является членом MyDatabase класса. В основном моя проблема заключается в том, как передать SaveItem<T> T как строку.

Я не знаю, ясно ли я объяснил свою проблему.

+0

Вы используете Entity Framework? –

+0

Нет в этом случае. Это SQLite в Xamarin Forms – Enrico

+0

Вы хотите, чтобы T была строкой? Почему бы просто не использовать строку? Это не должно быть общим, если вы ограничиваете его одним типом. – Krythic

ответ

0

Можно отображение а TableName к Type, например Dictionary<string,Type> Используйте Activator класс для построения типа. Используйте отражение, чтобы заполнить данные.

+0

Спасибо. Когда я вызываю «активатор», могу ли я получить что-то взамен? Например, чтобы обновить запись, я должен прочитать текущую запись и обновить ее. – Enrico

+0

И я могу выбрать GetMethod или GetMethodRuntime или что-то еще? – Enrico

+0

Если вы наследуете все типы из 'IBusinessEntity'. Вы можете использовать его для 'IBusinessEntity', например:' IBusinessEntity myObj = (IBusinessEntity) Activator.Create (typeNameStr) 'Вы можете переместить что-то вроде метода SaveItem в интерфейс. –

Смежные вопросы