C# 可观测集合的可拓方法<;MyType>;,MyType:IEnumerable<;MyType>;

C# 可观测集合的可拓方法<;MyType>;,MyType:IEnumerable<;MyType>;,c#,C#,在自定义类型的ObservableCollection上创建扩展方法时遇到问题。我需要创建的扩展方法是“ToAnotherType”类型(如,ToList,ToArray)。MyPoint示例实现了IEnumerable接口,但我认为我没有正确地公开收益率 真实的东西显然有更多的东西在进行,这只是控制台应用程序中的一个精简示例,用于识别问题。我尝试将OC更改为常规列表,以查看那里是否发生了什么事情,但事实并非如此 我看到许多“如何使您的类可枚举”示例创建了从List派生的第二个类(即,公共类My

在自定义类型的ObservableCollection上创建扩展方法时遇到问题。我需要创建的扩展方法是“ToAnotherType”类型(如,ToList,ToArray)。MyPoint示例实现了IEnumerable接口,但我认为我没有正确地公开收益率

真实的东西显然有更多的东西在进行,这只是控制台应用程序中的一个精简示例,用于识别问题。我尝试将OC更改为常规列表,以查看那里是否发生了什么事情,但事实并非如此

我看到许多“如何使您的类可枚举”示例创建了从List派生的第二个类(即,公共类MyPointList:List),但如果原始类型可以自己处理它,或者将它放在部分类文件中,那么这似乎是浪费

在扩展方法本身中的foreach出现之前,它看起来一直在工作——在这里我得到一个错误,说“MyPoint”不包含“X”和“Y”的定义

很明显,我可以用一个方法来处理转换,该方法接收一个列表并返回一个列表,但是如果有扩展名就太好了

关于我如何完成代码的参考资料:

使用系统;
使用System.Collections.Generic;
使用System.Collections.ObjectModel;
使用系统图;
使用系统集合;
命名空间EnumerableDemo
{
班级计划
{
静态void Main(字符串[]参数)
{
var myPoints=新的可观测集合
{
新MyPoint(10,10),
新MyPoint(20,20),
新MyPoint(30,30),
新MyPoint(40,40),
新MyPoint(50,50)
};
Console.WriteLine(“通过扩展方法打印单个点:”);
PrintSinglePointToConsole(myPoints[0].ToPoint());
控制台。写线(“”);
Console.WriteLine(“打印点的全部OC:”);
PrintPointsToConsole(myPoints.ToPoints());
Console.ReadLine();
}
公共静态无效打印SinglePointToConsole(点)
{
WriteLine(“点{0},{1}”,点.X,点.Y);
}
公共静态无效打印点控制台(列出点)
{
foreach(以点为单位的var项目)
{
WriteLine(“点:{0},{1}”,item.X,item.Y);
}
}
}
公共类MyPoint:IEnumerable
{
私有列表_myPoints=新列表();
私有int x{get;set;}=0;
公共int X{get{return{ux;}set{{ux=value;}}
私有int _y{get;set;}=0;
公共int Y{get{return{uy;}set{{uy=value;}}
公共MyPoint()
{
}
公共MyPoint(整数x,整数y)
{
_x=x;
_y=y;
}
公共IEnumerator GetEnumerator()
{
foreach(变量项在_myPoints中)
{
收益回报项目;
}
}
IEnumerator IEnumerable.GetEnumerator()
{
返回GetEnumerator();
}
}
公共静态类MyPointExtension
{
公共静态点拓扑点(此MyPoint点)
{
返回新点(点X、点Y);
}
公共静态列表拓扑点(此ObservableCollection列表)
{
var result=新列表();
foreach(列表中的变量项)
{
//错误行:
//“MyPoint”不包含“X”的定义,也不包含“X”的扩展方法
//无法找到接受第一个参数类型“MyPoint”的“X”。
结果。添加(新点(项目X、项目Y));
}
返回结果;
}
}
}

您不需要
ToPoints
中的
MyPoint
通用参数

只用

public static List<Point> ToPoints(this ObservableCollection<MyPoint> list)
顺便说一句,如果放弃_x和_y字段,您还可以使代码更干净、更短,如下所示:

public int X { get; set; } = 0;
public int Y { get; set; } = 0;

public MyPoint(int x, int y)
{
    X = x;
    Y = y;
}

最后一个代码块,它使用其他扩展方法ToPoint

public static List<Point> ToPoints(this ObservableCollection<MyPoint> list)
{
    var result = new List<Point>();

    foreach (var item in list)
    {
        result.Add(item.ToPoint());
    }

    return result;
}
公共静态列表拓扑点(此ObservableCollection列表)
{
var result=新列表();
foreach(列表中的变量项)
{
添加(item.ToPoint());
}
返回结果;
}

谢谢-谁知道删除9个字符可以解决几个小时的口误呢。MyPoint类确实包含DependencyProperties,因此存在支持存储以确保GetValue和SetValue进程是模拟的。但是,是的,我可以在变量声明中将x和y的默认值设置为=0,并删除示例应用程序的{get;set;}。实际上,FWIW,从MyPoints类中删除整个IEnumerable接口不会更改输出。唯一的问题实际上是方法签名。
public int X { get; set; } = 0;
public int Y { get; set; } = 0;

public MyPoint(int x, int y)
{
    X = x;
    Y = y;
}
public static List<Point> ToPoints(this ObservableCollection<MyPoint> list)
{
    var result = new List<Point>();

    foreach (var item in list)
    {
        result.Add(item.ToPoint());
    }

    return result;
}