6

MVC ストアフロントに着想を得て、私が取り組んでいる最新のプロジェクトでは、IQueryable の拡張メソッドを使用して結果をフィルター処理しています。

私はこのインターフェースを持っています。

IPrimaryKey
{
  int ID { get; }
}

そして私はこの拡張メソッドを持っています

public static IPrimaryKey GetByID(this IQueryable<IPrimaryKey> source, int id)
{
    return source(obj => obj.ID == id);
}

IPrimaryKey を実装するクラス SimpleObj があるとします。SimpleObj の IQueryable がある場合、IPrimaryKey の IQueryable として明示的にキャストしない限り、GetByID メソッドは存在しません。これは理想的とは言えません。

ここで何か不足していますか?

4

3 に答える 3

13

正しく行うと機能します。cfeduke のソリューションは機能します。ただし、IPrimaryKeyインターフェイスを汎用にする必要はありません。実際、元の定義をまったく変更する必要はありません。

public static IPrimaryKey GetByID<T>(this IQueryable<T> source, int id) where T : IPrimaryKey
{
    return source(obj => obj.ID == id);
}
于 2008-09-17T17:15:31.257 に答える
4

編集:Konradのソリューションは、はるかに単純であるため、より優れています。以下のソリューションは機能しますが、継承階層を上ることなくクラスのメソッドがリフレクションによって取得されるObjectDataSourceと同様の状況でのみ必要です。明らかに、それはここでは起こっていません。

これは可能です。ObjectDataSourceを操作するためのカスタムエンティティフレームワークソリューションを設計したときに、同様のパターンを実装する必要がありました。

public interface IPrimaryKey<T> where T : IPrimaryKey<T>
{
    int Id { get; }
}

public static class IPrimaryKeyTExtension
{
     public static IPrimaryKey<T> GetById<T>(this IQueryable<T> source, int id) where T : IPrimaryKey<T>
     {
         return source.Where(pk => pk.Id == id).SingleOrDefault();
     }
}

public class Person : IPrimaryKey<Person>
{
    public int Id { get; set; }
}

使用の抜粋:

var people = new List<Person>
{
    new Person { Id = 1 },
    new Person { Id = 2 },
    new Person { Id = 3 }
};

var personOne = people.AsQueryable().GetById(1);
于 2008-09-17T17:10:11.377 に答える
2

ジェネリックには継承パターンに従う機能がないため、これは機能しません。すなわち。IQueryable<SimpleObj> は IQueryable<IPrimaryKey> の継承ツリーにありません

于 2008-09-17T12:16:53.597 に答える