2016-04-17 8 views
2

次のコードはエラーを返し必要ListViewへのXAMLバインディングを担当するクラス(今は関係ありません)。 3クラスの一人一人にも私にエラーを与える:C#が新しい制約についての説明(新しいT(...))

'Reading' must be a non-abstract type with a public parameterless constructor in order to use it as parameter 'T' in the generic type or method 'ItemWindow.HandleBookLogic()

私はC#には非常に新鮮だし、私は一種のエラーを「理解」が、それらを処理する方法がわかりません。

ヘルプを評価してください。

EDIT:エクストラコード:

private void Add_Click(object sender, RoutedEventArgs e) 
{ 

    if (Type.Text == "Journal") 
    { 
     HandleJournalLogic(); 
    } 
    else 
    { 
     if (Type.Text == "Reading") 
      HandleBookLogic<Reading>(); 
     else if (Type.Text == "Cooking") 
      HandleBookLogic<Cooking>(); 
     else 
     { 
      HandleBookLogic<Science>(); 
     } 
    } 
    InitFields(); 
} 

私はそれを学ぶことができますので、誰かが私のコードを修正することはできますか?

+0

経験豊かなプログラマーにとってはおそらく最良の解決策ではないことがわかりますが、実際にあなたが全体として行っていることに応じて最適な解決策を提案することは難しいです... – Phil1970

答えて

3

new制約は、パラメータのないコンストラクタに対してのみです。引数を取るコンストラクタが必要な場合は、呼び出し側がインスタンスを構築する方法を伝える必要があります。 1つの一般的なアプローチは、メソッドがファクトリデリゲートを引数として取ることです。

例えば、を取るコンストラクタでは、Func<int, T>を取ることができます。呼び出し元はラムダを使用して関数を提供できます。

正確なコンストラクタシグネチャがわかっている場合は、リフレクション、またはdynamicも使用できます。これらのオプションはどちらもデリゲートを渡すよりもずっと遅くなります。あなたのニーズに応じて、問題はないかもしれません。

+0

これは唯一の方法ですか?私はあなたが私を導くことができるようにいくつかのコードで自分の投稿を更新します。 thxメイト。 – N3wbie

+1

あなたのコード例から、実際には、正常なサブタイプ多型を使用して異なる実装にディスパッチするのが最善の解決策であると私は思っています。つまり、どのタイプの操作を行うかを表す文字列を切り替えるのではなく、さまざまな操作に*実際の型*を使用するだけです。 –

+0

私はC#を初めて使い、数日前にデリゲートという概念を学んだので、デリゲートを使って解決策を見たいと思っています。 – N3wbie

関連する問題