抽象ジェネリック メソッドに問題があります。
抽象メソッド定義
protected abstract T InitEntity<T>(ref NpgsqlDataReader reader) where T : BaseEntity, new();
実装
protected override EUser InitEntity<EUser>(ref NpgsqlDataReader reader) {
オーバーライド関数の EUser クラスに問題があります。この関数は、EUser を Generic T still として扱い、BaseEntity 関数のみを使用できるように見えます。ERole は BaseEntity を実装する別のクラスであり、関数でそのエンティティのすべての機能を使用できます。EUser を使用したい場合は、親 BaseEntity にない関数を使用するたびに EUser に型キャストする必要があります。私の目標は、データリーダーを子クラスに渡して、必要な情報を入力させることでしたが、それは面倒です。子クラス内のすべての型を変換するために多くのオーバーヘッド型を費やしたくありません。
これはジェネリック クラスと同じではありません。子ジェネリック クラスを実装すると、EUser を親クラスに指定して、そのエンティティのすべての機能を引き続き使用できます。
他の誰かがこれに問題を抱えていましたか、それとも抽象ジェネリック関数を正しく実装していませんか?
親関数は次のように始まります。
protected T Select<T>(string sql, params NpgsqlParameter []) {
次に、親クラスは次のように関数を呼び出します。
T entity = InitEntity<T>(ref dr);
問題は、サブクラス メソッドが EUser のみを受け入れて使用するにもかかわらず、サブクラス メソッドを生成するために T が使用されることです。メソッドでは引き続きジェネリック T として扱われます。何か提案はありますか?
これはすべて、子クラスと共有したくないいくつかのプライベート フィールドを持つ親クラスがあるために発生します。ジェネリック メソッド InitEntity は、これらのプライベート フィールドの一部を使用します。このため、私はジェネリックメソッドをいじっています。おそらく、実装を再考し、子ジェネリック クラスで解決する必要があるだけです。
編集:
C# の Generic Methods では、関数が呼び出されるたびに変数の型が定義されているように見えます。主要な型変換なしでは、関数レベルでその型をさらに定義することはできないようです。私が行ったようにサブクラス関数に型を実装しようとすると、すべてがコンパイルされて機能しますが、サブクラスの型は渡された型として扱われます。上記で定義された私の問題については、ジェネリックを単なる関数ではなくクラス レベルに変更します。抽象的なジェネリック関数を作成します。子関数は、渡されるもののジェネリック T を保持する必要があり、関数の本体でそれを型変換します。