C# 如何转换为泛型集合
我有一个通用的集合路径,其中T是段-段是抽象类。 我有一个路径的派生类ClosedPath,它包含从抽象基类段通过中间类LineSegment导出的派生类SpecialLineSegments。 我正在尝试选择符合条件的路径,然后我将对其进行修改,使其可能包含不同类型的段,并且可能不再是闭合路径……因此我正在尝试转换为路径。编译器给出错误消息,表示无法执行此强制转换C# 如何转换为泛型集合,c#,generics,casting,abstract-class,C#,Generics,Casting,Abstract Class,我有一个通用的集合路径,其中T是段-段是抽象类。 我有一个路径的派生类ClosedPath,它包含从抽象基类段通过中间类LineSegment导出的派生类SpecialLineSegments。 我正在尝试选择符合条件的路径,然后我将对其进行修改,使其可能包含不同类型的段,并且可能不再是闭合路径……因此我正在尝试转换为路径。编译器给出错误消息,表示无法执行此强制转换 public static void Method1(ClosedPath[] paths) {
public static void Method1(ClosedPath[] paths)
{
bool condition = false;
//working code..
Path<Segment> Pslct = new Path<Segment>();
foreach (ClosedPath P in paths)
{
if (condition)
{
//working code
Pslct = (Path<Segment>) P;
}
}
}
路径定义如下
public class Path<T> : IEnumerable<T> where T : Segment
{
private List<T> segments = new List<T>();
public List<T> Segments
{
set { segments = value;}
get { return this.segments; }
}
public T this[int pos]
{
get { return (T)segments[pos]; }
set { segments[pos] = value; }
}
public Path()
{
this.Segments = new List<T>();
}
public Path(List<T> s)
{
this.Segments = s;
}
public void AddSegment(T s) {Segments.Add(s);}
public int Count {get {return Segments.Count;}}
IEnumerator<T> IEnumerable<T>.GetEnumerator()
{ return Segments.GetEnumerator();}
IEnumerator IEnumerable.GetEnumerator()
{ return Segments.GetEnumerator(); }
}
从导出的ClosedPath
public class LinePath<T> : Path<T>, IEnumerable<T> where T : LineSegment
{
//working code
}
LineSegment源于段无法从ClosedPath路径转换为由于列表原因而导致的路径。
例:
假设ClosedPath:LinePath,您应该能够使用LINQ.Cast
由于列表原因,无法从ClosedPath路径转换为路径。
例:
假设ClosedPath:LinePath,您应该能够使用LINQ.Cast
写一个显式转换操作符。我想我可以做到这一点,但我也认为显式转换操作符只适用于不相关的继承类。我本以为我的两个路径Path和ClosedPath通过继承关系。ClosedPath的基类是什么?从Path派生的泛型类…将在上面进行编辑。我正在使用Visual Studio 2010…所以不确定。请编写一个显式转换运算符。我本以为可以这样做,但我也认为显式转换运算符仅用于不相关的类被继承。我本以为我的两个路径Path和ClosedPath是通过继承关联的。ClosedPath的基类是什么?从Path派生的泛型类…将在上面进行编辑。我使用的是Visual Studio 2010…所以不确定。是的。我没有LINQ的经验…也许我应该快速阅读LINQ。多看一点这个-。演员阵容不起作用。已编辑的答案。显式转换解决方案可以编译,但在运行时测试之前还有一些其他的事情要做。由于列表是不变的,这就给这些类之间的转换工作带来了麻烦。在使用提供的代码段在我的终端上运行了一些测试之后。Cast无法按预期工作-您可能需要手动执行转换。请参见上文是的,它可以。我没有LINQ的经验…也许我应该快速阅读LINQ。多看一点这个-。演员阵容不起作用。已编辑的答案。显式转换解决方案可以编译,但在运行时测试之前还有一些其他的事情要做。由于列表是不变的,这就给这些类之间的转换工作带来了麻烦。在使用提供的代码段在我的终端上运行了一些测试之后。Cast无法按预期工作-您可能需要手动执行转换,请参见上文
List<Segment> foo = new List<LineSegment>(); //Will not compile
if (condition)
{
//working code
// Convert the ClosedPath LineSegments to Sements to create the Path<Segment>
Pslct = new Path<Segment>(P.Cast<Segment>().ToList());
Path<Segment> Pslct = paths.Cast<Path<Segment>>();