2016-05-04 21 views
0

同じプロパティを持っていれば、さまざまなタイプのセットで機能する拡張メソッドを作成できますか?たとえば :同じプロパティを持つさまざまなタイプの一般的な拡張メソッド

public static T GetObjectByIdOrName<T>(this IEnumerable<T> collection, Mapping mapping) where T : IType1, IType2, IType3 
    { 
     return collection.FirstOrDefault(x => x.Id == mapping.ObjectId || x.Name == mapping.ObjectName); 
    } 

全てのタイプは、IDとNameプロパティはので、私はこれが可能であろう期待してい - しかし、コンパイラはType1.IdとType2のIdとのあいまいな参照があることを私に言っています...

これを実装する方法はありますか? (私はそれらのための共通の基盤を作成することはできません)

+1

これらのクラスはあなたのコントロール下にありますか? – Colin

+2

この制約は、タイプが3つのインタフェースすべてを実装しなければならないことを意味します。彼らがすべて同じプロパティを公開している場合、プロパティのいずれかが明示的に実装されている場合、どのインターフェイスを経由するべきかは分かりません。 – juharr

+0

各インタフェースを1つの基本インタフェースを使用するようにリファクタリングすることはできますか? –

答えて

3

適切なコードデザインがあればかなり簡単です。共通のインターフェースを共有させるだけです。

public interface IBase 
{ 
    object Id{ get; set; } 
    string Name{ get; set; } 
} 

public interface IType1 : IBase{} 
public interface IType2 : IBase{} 

public static T GetObjectByIdOrName<T>(this IEnumerable<T> collection, Mapping mapping) where T : IBase 
{ 
    //... get T.Id or T.Name 
} 

それ以外の場合は、設計に暗黙のうちに共有実装が存在しないため、動的にプロパティが存在することを思いとどまらせることができます。

public static object GetObjectByIdOrName(this IEnumerable collection, Mapping mapping) 
{ 
    return collection.Cast<dynamic>().FirstOrDefault(x => x.Id == mapping.ObjectId || x.Name == mapping.ObjectName); 
} 
+0

'IType1'と' IType2'は外部プロジェクトから来たものです –

+1

私は動的なアプローチが好きです。 – Bartosz

+0

@SamIam - そうですが、答えを書いてから私が提供するまで彼は明確にしませんでした彼がインタフェースを制御できなかった場合の代替手段です。 – Colin

関連する問題