2016-05-04 36 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

相关问题