具有相同属性的各种类型的通用扩展方法

时间:2016-05-04 17:12:45

标签: c# generics

我想知道,如果它们具有相同的属性,是否可以创建一个可以使用一组不同类型的扩展方法? 例如:

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 个答案:

答案 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);
}