4

ストアド プロシージャの結果セットを解析するための小さなライブラリを作成しています (基本的に、非常に特殊な種類の 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);

しかし、それは呼び出しを複雑にしすぎるという目的を幾分無効にします。

このシナリオで型推論を行う方法はありますか?

4

1 に答える 1

0

また、型を推測する C# コンパイラの機能が「角を曲がったところ」で機能しないことにも気付きました。

あなたの場合、追加のメソッドは必要ありません。Child[]asICollection<TChild>と書き換えるだけで、署名は配列、リストなどと一致します。

    public ParserSettings<TChild> IncludeList<TChild, TKey>(
        Expression<Func<T, ICollection<TChild>>> listProp,
        Func<T, TKey> foreignKey,
        Func<TChild, TKey> primaryKey,
        int resultSetIdx) {
            ...
        }
于 2013-03-15T07:59:47.070 に答える