2016-05-04 71 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); 
    } 

所有類型有編號和名稱的屬性,所以我希望這將是可能的 - 但是,編譯器告訴我,有Type1.Id和type2標識之間的曖昧參考...

有什麼辦法可以實現這個嗎? (我無法爲它們創建公共基地)

+1

這些類在你的控制下嗎? – Colin

+2

該約束意味着類型必須實現所有3個接口。如果他們都暴露相同的屬性,那麼它不知道應該通過哪個接口,在任何屬性明確實現的情況下。 – juharr

+0

您可以重構使每個接口使用一個基本接口嗎? –

回答

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

我想知道爲什麼downvote ...我喜歡動態的方法 – Bartosz

+0

@ Samam - 對,但他沒有澄清,直到我寫了答案後,我提供了另一種情況是他無法控制接口。 – Colin

相關問題