すべてのDAOクラスが派生するジェネリッククラスがあります。これは以下で定義されています。すべてのエンティティの基本クラスもありますが、それは一般的ではありません。
外部キーの関係を満たすために主キーを取得しようとしているため、メソッドGetIdOrSave
は定義した方法とは異なるタイプになりますSabaAbstractDAO
。したがって、この関数は、主キーを取得するか、エンティティを保存してから主キーを取得するために使用されます。鍵。
最後のコードスニペットには、一般的な部分を取り除いた場合の動作に関する解決策があるため、分散を使用することでこれを解決できると思いますが、コンパイルするインターフェイスの記述方法がわかりません。
public abstract class SabaAbstractDAO<T> :ISabaDAO<T> where T:BaseModel
{
...
public K GetIdOrSave<K>(K item, Lazy<ISabaDAO<BaseModel>> lazyitemdao)
where K : BaseModel
{
...
}
コンパイルしようとすると、このエラーが発生します。
Argument 2: cannot convert from 'System.Lazy<ORNL.HRD.LMS.Dao.SabaCourseDAO>' to 'System.Lazy<ORNL.HRD.LMS.Dao.SabaAbstractDAO<ORNL.HRD.LMS.Models.BaseModel>>'
私はそれをこのように呼ぼうとしています:
GetIdOrSave(input.OfferingTemplate,
new Lazy<ISabaDAO<BaseModel>>(
() =>
{
return (ISabaDAO<BaseModel>)new SabaCourseDAO() { Dao = Dao };
})
);
定義をこれに変更すると、機能します。
public K GetIdOrSave<K>(K item, Lazy<SabaCourseDAO> lazyitemdao) where K : BaseModel
{
それで、分散(必要な場合)とジェネリックを使用してこれをコンパイルするにはどうすればよいですか?それで、とでのみ機能する非常に一般的なメソッドを持つことができBaseModel
ますAbstractDAO<BaseModel>
か?メソッドとおそらく抽象クラス定義を変更するだけでよいと思います。使用法は問題ないはずです。
更新: 非常に役立つ応答で、少し改善された例がありますが、興味深いジレンマがあります:
私はこれを今定義しました、そして私は矛盾するエラーを得るのでここにまたはin
Tを持っていません、もしそうなら私はそれがそうであるに違いないと思います、そしてそれで私はそれを不変にしました、それはVS2010が理解できないように見えるからですそれを出します。out
out T
contravariantly valid
in T
covariantly valid
public interface ISabaDAO<T> where T:BaseModel
{
string retrieveID(T input);
T SaveData(T input);
}
コンパイルはしましたが、このエラーが発生します。
System.InvalidCastException: Unable to cast object of type 'ORNL.HRD.LMS.Dao.SabaCourseDAO' to type 'ORNL.HRD.LMS.Dao.ISabaDAO`1[ORNL.HRD.LMS.Models.BaseModel]'.
上記の2つのコードスニペットを修正しましたが、ここで期待したように分散が機能しないようです。
私はこれを試しました:
public delegate K GetIdOrSave<out K>(K item, Lazy<ISabaDAO<BaseModel>> lazyitemdao)
where K : BaseModel;
しかし、私はインターフェースと同じ問題を抱えています、それを置くout
と不平を言うので、私in
は反対の不満を置きます。
これが合法であれば、これを機能させることができると思います。
public delegate K GetIdOrSave<K>(in K item, out Lazy<ISabaDAO<BaseModel>> lazyitemdao)
where K : BaseModel;