と部分的にジェネリック型推論の欠如を中心に作業を私はこのメンバーを持っている(リポジトリで使用されている)のインターフェイスを持つ:制約
T FindById<T, TId>(TId id)
where T : class, IEntity<TId>
where TId : IEquatable<TId>;
これは、呼び出し側がエンティティタイプ(T
)を指定することができますし、そのタイプはId
フィールド(TId
)です。このインターフェイスの実装者は、タイプT
のエンティティを見つけ、id
パラメータを使用して、そのID(IEntity<TId>
で定義されている)に従ってフィルタリングします。
現在、私はこのようにそれを呼んでいる:
int id = 123;
var myApproval = PartsDC.FindById<Approval, int>(id);
理想的には私がこれを行うにはしたいと思います:
int id = 123;
var myApproval = PartsDC.FindById<Approval>(id);
私はこの質問に対しての答えを読んだ:
Partial generic type inference possible in C#?
私が望む構文を得ることはできませんが、近づけることができます。私はかなり私の場合は、私の一般的なパラメータの制約のためにセットアップを取得することはできません。
ここで私がこれまで持っているものです。
public class FindIdWrapper<T> where T : class
{
public readonly IDataContext InvokeOn;
public FindIdWrapper(IDataContext invokeOn)
{
InvokeOn = invokeOn;
}
T ById<TId>(TId id) where TId : IEquatable<TId>
{
return InvokeOn.FindById<T, TId>(id);
}
}
public static class DataContextExtensions
{
public static FindIdWrapper<T> Find<T>(this IDataContext dataContext) where T : class, IEntity
{
return new FindIdWrapper<T>(dataContext);
}
}
私が手にコンパイルエラーがある:
The type 'T' cannot be used as type parameter 'T' in the generic type or method 'PartsLegislation.Repository.IDataContext.FindById<T,TId>(TId)'. There is no implicit reference conversion from 'T' to 'PartsLegislation.Repository.IEntity<TId>'.
私は私のラッパークラスでT
のみに制限されているので、それは言っているかを理解参照型ですが、FindById
関数はIEntity<TId>
であることを望んでいますが、TId
がメソッド内にあるので、それを行うことはできません(そうでなければ、正方形 1)。
どうすればこの問題を回避できますか(できません)?
'FindIdWrapper'に制約として' TID'を追加できませんか? – Nick
@Nickいいえ、部分アプリケーションの時点で 'TID'が分からないので –