2017-07-13 8 views
0

私は異なる種類のクラス/タイプのメソッドを使いたいです。C#複数のクラス/タイプのメソッドを使用する

たとえば、DropTableの "Project"はクラスの名前ですしかし、私のような、より一般的な多くのものを好む(これは私が何をすべきかわからない部分です):

public void ClearTable(Type t) 
    { 
     try 
     { 
      using (var connection = new SQLiteConnection(platform, dbPath)) 
      { 
       connection.DropTable<t>(); 
       connection.CreateTable<t>(); 
      } 
     } 
     catch (SQLiteException ex) 
     { 
      Log.Info("SQLiteEx", ex.Message); 
     } 

    } 

どのように私はクラス/タイプの複数の種類をサポートするために、最後の方法のようなものを使用することができますか?

+1

メソッドのシグネチャを次のように変更します。 'public void ClearTable ()' – maccettura

+0

@Robertは、あなたが探しているジェネリックであるか(私の答えを参照してください)、またはパラメータとしてタイプを持つメソッドを強制的に呼び出す必要があります。実行時の汎用メソッド? – Iqon

答えて

4

あなたは、このようなコードを書くことができジェネリック医薬品ジェネリック医薬品で

を探しています:

public void ClearTable<TType>() 
{ 
    try 
    { 
     using (var connection = new SQLiteConnection(platform, dbPath)) 
     { 
      connection.DropTable<TType>(); 
      connection.CreateTable<TType>(); 
     } 
    } 
    catch (SQLiteException ex) 
    { 
     Log.Info("SQLiteEx", ex.Message); 
    } 
} 

あなたは、メソッドを呼び出すと、一般的なパラメータとして任意の型を与えることができます:

ClearTable<MyDomainModel>(); 

addititionであなたがwhere句でジェネリックパラメータTTypeを制限することができます。

public void ClearTable<TType>() 
    where TType : IDomainModel 
{ 
    // your code goes here 
} 

IDomainModelから継承するタイプは、汎用パラメータとしてのみ指定できます。

1

ClearTableというコードがどのようなものかによって異なります。

それは、コンパイル時にタイプを知っている場合、あなたは

public void ClearTable<T>() 

にあなたのプロトタイプを変更する...と

var myClass = new MyClass(); 
myClass.ClearTable<Task>(); 

かでそれを呼び出すことができます

バインディングコンパイル時

myClass.ClearTable<Project>(); 

ランタイム型は実行時まで知られていない場合は

を結合し、あなたが本当にそのような文字列としてそれを渡す必要があり、あなたは次のようにデリゲート辞書を設定できます。

class MyClass 
{ 
    private readonly Dictionary<string, Action<SQLLiteConnection>> _actions = new Dictionary<string, Action<SQLLiteConnection>>(); 

    public MyClass() 
    { 
     _actions.Add("Project", conn => conn.DropTable<Project>()); 
     _actions.Add("Task", conn => conn.DropTable<Task>()); 
    } 

    public void ClearTable(string type) 
    { 
     try 
     { 
      using (var connection = new SQLiteConnection(platform, dbPath)) 
      { 
       var action = _actions[type](connection); 
       action(connection); 
      } 
     } 
     catch (KeyNotFoundException ex1) 
     { 
      Log.Info(String.Format("{0} is not a supported type.", type)); 
     } 
     catch (SQLiteException ex2) 
     { 
      Log.Info("SQLiteEx", ex2.Message); 
     } 
    } 
} 
+0

私はIqonのソリューションを実装しました。あなたの評判とコードの "複雑さ"に基づいて、より良いエラー処理など私はあなたのコードがより安定して保存され、より多くのC#の慣習によると感じている。私はC#で新しく静かで、より良い開発者になりたい。私がより良い開発者になるという意図で、Iqonのソリューションは悪いと言っているわけではありません。基本的に私の "悪い"コードが良くなりました。あなたのコードがIqonよりも "良い"ことを確認できますか?あなたが好きなら、理由を説明してもらえますか? – Robert

+1

私のソリューションの前半はIqonと同じですので、それは「より良い」というわけではありません。後半は、タイプが文字列として渡されなければならない異常な状況でのみ使用します。ランタイム。 –

関連する問題