代码之家  ›  专栏  ›  技术社区  ›  Pierre-olivier Gendraud

如何在扩展方法中重用泛型接口的代码?

c#
  •  1
  • Pierre-olivier Gendraud  · 技术社区  · 3 年前

    坐标是关于点位置的信息(这可能是极坐标/笛卡尔坐标(例如)

    我有这个界面:

    interface ICreateOrderOnASpace<Coordinate,T>{
        Coordinate getPosition(XYZ p);
        int ComparaisonPosition(Coordinate c1, Coordinate c2);
         
    
    }
    

    我想创建一个扩展方法,通过一个函数从元素中得到一个3d点,来对元素列表进行排序

    class CreateOrderOnASpaceExtensions<Coordinate,T>{
        IOrderedEnumerable<T> OrderElements(this ICreateOrderOnASpace<Coordinate,T> myInterface, IEnumerable<T> elements,Func<T,XYZ> f){
            elements.OrderBy(
                    x => myInterface.getPosition(f(x)),
                    Comparer<Coordinate>.Create(myInterface.ComparaisonPosition)
                    )
        }
    }
    

    1 回复  |  直到 3 年前
        1
  •  2
  •   Marc Gravell    3 年前

    将类设置为非泛型和静态,而将扩展方法设置为泛型:

    static class CreateOrderOnASpaceExtensions
    {
        public static IOrderedEnumerable<T> OrderElements<Coordinate,T>(
            this ICreateOrderOnASpace<Coordinate,T> myInterface,
            IEnumerable<T> elements,Func<T,XYZ> f)
            => elements.OrderBy(
                x => myInterface.getPosition(f(x)),
                    Comparer<Coordinate>.Create(myInterface.ComparaisonPosition)
            );
    }