2016-09-06 8 views
-1

大きなデータベースのためのデバイスとサーバーの間に同期関数を作成しています。私は多くのリスティングテーブル(ドロップダウン/ピッカー内のアイテム)を持っています。 私は、データベースAに保存するとC#一般的なT関数(Tは文字列からのものです)

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

のようなテーブルをリスト定義され、私は多くのコードを書くことをしたくないと私はエレガントな解決策を探しています:)

SQLiteの中のデバイス上で新しいレコード(アイテム)デバイスは構造が

public class SyncResult { 
     public int DeviceId { get; set; } 
     public int ServerId { get; set; } 
     public string TableName { get; set; } 
     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); 
      } 
     } 
    } 

この関数を呼び出します

次に、DeviceId == 0の場合は新しいレコードを挿入するか、既存のアイテムを更新します。

私の質問は:どのように私はTSyncResultからテーブル名あるSaveItemを呼び出すことができますか?

は(私はそのためにビールを提供することができます!)任意の助けを事前にいただきありがとうございます


SaveItemMyDatabaseクラスのメンバーです。基本的に私の問題はSaveItem<T>にTを文字列として渡す方法です。

私が明らかに問題を説明しているかどうかわかりません。

+0

Entity Frameworkを使用していますか? –

+0

この場合、いいえ。 XamarinフォームのSQLiteです – Enrico

+0

Tを文字列にしますか?なぜ文字列を使用しないのですか? 1つのタイプに制限する場合は、一般的ではありません。 – Krythic

答えて

0

TableNameTypeにマップすることができます。Dictionary<string,Type>Activatorクラスを使用して型を構築します。リフレクションを使用してデータを入力します。

+0

ありがとうございます。 'Activator'を呼び出すと、何かを受け取ることができますか?たとえば、レコードを更新するには、現在のレコードを読み込んで更新する必要があります。 – Enrico

+0

GetMethodまたはGetMethodRuntimeなどを選択できますか? – Enrico

+0

「IBusinessEntity」からすべてのタイプを継承する場合。 'IBusinessEntity myObj =(IBusinessEntity)Activator.Create(typeNameStr)' 'SaveItem'メソッドのようなものをインターフェースに移すかもしれません。 –

関連する問題