2009-05-07 21 views
0

私はRob Conneryの店頭ビデオシリーズとそのテクニックを適用して、このmvcプロジェクトに取り組んでいます。 は、フィルタリングと拡張メソッドでは、私は自分自身のような多くの繰り返しを開始:sがありません。しかし一般的な拡張方法

public static T WithID<T>(this IQueryable<T>qry,int ID) 
{ 
    return qry.SingleOrDefault(s=>ID==ID); 
} 

:これを防止するために

public static Sponsor WithID(this IQueryable<Sponsor>qry, int ID) 
{ 
    return qry.SingleOrDefault(s => s.ID== ID); 
} 

public static Keyword WithID(this IQueryable<Keyword>qry,int ID) 
{ 
    return qry.SingleOrDefault(s => s.ID== ID); 
} 
.... 

を、私はこのような一般的な拡張機能を記述してみてくださいあなたはこれをどうやって解決しますか?

答えて

5

IDプロパティを宣言するインターフェイスが必要です(例:あなたが書くことができます

public interface IInt32Identifiable 
{ 
    public int ID { get; } 
} 

その後:もちろん

public static T WithID<T>(this IQueryable<T> source, int id) 
    where T : IInt32Identifiable 
{ 
    return source.SingleOrDefault(s=> s.ID == id); 
} 

を、あなたはすべての適切なクラスがインターフェイスを実装するために必要があります - それは、通常は簡単です。クラスがデザイナーによって生成されている場合は、おそらく部分クラスを使用することになります。

0

2つの異なる拡張方法が必要です。 1つはIDを持つタイプ用で、もう1つはIDを持たないタイプ用です。すべてのIDの型が実装するインタフェースまたは抽象基本クラスも必要です。そうしないと、コンパイラはIDを逆参照させません。

私が考えることができる唯一の他の選択肢は、IDプロパティの型を照会するためのリフレクションが必要で、存在する場合はその値を取得する必要があります。

関連する問題