2011-08-16 6 views
0

ジェネリックで.NETエンタープライズライブラリのExecuteSprocAccessorメソッドを使用して、1つのクラスを使用してデータベース上のすべてのCRUDを処理しようとしています。私のデータ層では、私はこのような何かしようとしていた:ジェネリックでエンタープライズライブラリのExecuteSprocAccessorメソッドを使用する

「T」次の条件を満たす必要があります。しかし

public static class CRUDDatabase 
{ 
    private static Database db = DatabaseFactory.CreateDatabase("ITS"); 

    public static T SelectSingle<T>(string sprocName, int id) 
    { 
     return db.ExecuteSprocAccessor<T>(sprocName, id).First(); 
    } 
} 

を、私は述べてSelectSingle()メソッドで戻りライン上でビルドエラーを取得します ジェネリック 型またはメソッド'Microsoft.Practices.EnterpriseLibrary.Data.DatabaseExtensions.ExecuteSprocAccessor(Microsoft.Practices.EnterpriseLibrary.Data)のパラメータ' TResult 'として使用するには、パブリックパラメータなし コンストラクタを使用する非抽象型にする必要があります。 .Database、 文字列、paramsオブジェクト[]) '

SelectSingle()メソッドの背後にある考え方は、ストアドプロシージャ名とデータベースから必要なオブジェクトのレコードIDを渡すことです。最終的には、SelectAll()、Update()、Delete()などがあります。これらのメソッドのパラメータは異なりますが、達成しようとしていることのアイデアが得られます。

このエラーを読んだ後、私はこれが不可能かもしれないと考え始めていますが、これがうまくいくかどうかは誰にでも分かりますか?また、データベースの私のフィールドは、私のクラスのフィールドと1:1でマッチするので、マッパーを指定していないのです。

おかげ

答えて

3

は、コンパイラが間違って何を言っている:それはそれで、ゼロ引数のパブリックコンストラクタを持っているタイプを期待しています。あなたが手渡したものはすべてTを保証するものではないので、コンパイルされません。

一般制約を追加して、Tの種類を制限する必要があります。幸いにも、それは自明簡単です:

コンパイラ「ここ 必要渡された任意のタイプを伝えます
public static T SelectSingle<T>(string sprocName, int id)  
    where T : new() // <---- here's the constraint 
{ 
    return db.ExecuteSprocAccessor<T>(sprocName, id).First();  
} 

は、ゼロ引数のコンストラクタを持っているトリックのおかげでクリスをした恐ろしい

+0

を、。。。 – ryanulit

関連する問題