ストアド プロシージャの結果セットを解析するための小さなライブラリを作成しています (基本的に、非常に特殊な種類の ORM)。
授業がある
class ParserSetting<T> // T - type corresponding to particular resultset
{
...
public ParserSettings<TChild> IncludeList<TChild, TKey>(
Expression<Func<T, TChild[]>> listProp,
Func<T, TKey> foreignKey,
Func<TChild, TKey> primaryKey,
int resultSetIdx)
{ ... }
}
ここで、メソッドIncludeList
はその結果セット番号を指定します。resultSetIdx
オブジェクトで構成されているかのように解析し、式で定義されたプロパティに (配列として)TChild
割り当てる必要があります。listProp
私は次のように使用しています:
class Parent
{
public int ParentId {get;set;}
...
public Child[] Children{get;set;}
}
class Child
{
public int ParentId {get;set;}
...
}
ParserSettings<Parent> parentSettings = ...;
parentSettings.IncludeList(p => p.Children, p=> p.ParentId, c => c.ParentId, 1);
この方法は魅力として機能します。ここまでは順調ですね。
配列に加えて、さまざまなタイプのコレクションをサポートしたいと考えています。したがって、次のメソッドを追加しようとしています。
public ParserSettings<TChild> IncludeList<TChild, TListChild, TKey>(
Expression<Func<T, TListChild>> listProp,
Func<T, TKey> foreignKey,
Func<TChild, TKey> primaryKey,
int resultSetIdx)
where TListChild: ICollection<TChild>, new()
{ ... }
ただし、次のように使用しようとすると:
class Parent
{
public int ParentId {get;set;}
...
public List<Child> Children{get;set;}
}
class Child
{
public int ParentId {get;set;}
...
}
ParserSettings<Parent> parentSettings = ...;
parentSettings.IncludeList(p => p.Children, p=> p.ParentId, c => c.ParentId, 1);
C# コンパイラは、「メソッド ParserSettings.IncludeList(...) の型引数を推論できません」というエラー メッセージを発行します。
タイプを明示的に指定すると機能します。
parentSettings.IncludeList<Child, List<Child>, int>(
p => p.Children, p=> p.ParentId, c => c.ParentId, 1);
しかし、それは呼び出しを複雑にしすぎるという目的を幾分無効にします。
このシナリオで型推論を行う方法はありますか?