我想知道,如果它们具有相同的属性,是否可以创建一个可以使用一组不同类型的扩展方法? 例如:
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之间存在模糊引用...
有没有办法实现这个? (我不能为他们创建一个共同的基础)
答案 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);
}