[英]Getting properties of derived object from base object list
我正在寻找一种从派生类获取属性的简单方法,该派生类继承了抽象类。
我的代码:
public abstract class PointLayer
{
public abstract Type Type { get;}
}
public class PointLayer<T> : PointLayer
{
#region PROPERTIES
public override Type Type { get; }
public string MapName { get; private set; }
public MapType MapType { get; private set; }
public Point<T> Point { get; private set; }
#endregion
#region C'TOR
/// <summary>
/// Constructor creating PointLayer
/// </summary>
/// <param name="mapName">Map name</param>
/// <param name="mapType">Map type</param>
/// <param name="point">Point</param>
public PointLayer(string mapName, MapType mapType, Point<T> point)
{
MapName = mapName;
Point = point;
MapType = mapType;
}
#endregion
}
我尝试从图层列表的元素中获取MapName。
Layers = new List<PointLayer>();
在Layers = new List<PointLayer>();
图层是父类的列表。 您不能从父类访问子属性,因为不能保证PointLayer类型的对象具有属性MapName。
如果您确定对象实际上是PointLayer类型,则可以强制转换它们:
var GenericLayers = new List<PointLayer<int>>();
List<PointLayer> Layers = GenericLayers.Select(x => (PointLayer)x).ToList();
List<int> MapNames = Layers.Select(x => ((PointLayer<int>)x).MapName).ToList();
编辑:
给出答案后,您需要一个不同类型的PointLayer的列表,您只需使用PointLayer的列表即可:
public abstract class PointLayer
{
public abstract Type Type { get;}
public abstract string MapName { get; protected set; }
public abstract MapType MapType { get; protected set; }
public abstract Point Point { get; protected set; }
}
public class PointLayer<T> : PointLayer
{
#region PROPERTIES
public override Type Type { get; }
public override string MapName { get; protected set; }
public override MapType MapType { get; protected set; }
public override Point Point { get; protected set; }
#endregion
#region C'TOR
/// <summary>
/// Constructor creating PointLayer
/// </summary>
/// <param name="mapName">Map name</param>
/// <param name="mapType">Map type</param>
/// <param name="point">Point</param>
public PointLayer(string mapName, MapType mapType, Point<T> point)
{
Type=typeof(T);
MapName = mapName;
Point = point;
MapType = mapType;
}
#endregion
}
然后
Layers = new List<PointLayer>();
var MapNames=Layers.Select(x=>x.MapName);
从point
继承Point<T>
,我认为这是您可以做的最好的事情。 根据Point<T>
具有Point
,这可能就足够了。 尽管您将无法分辨出point的类型参数是什么,但是由于您仅在运行时知道这一点,因此无法解决。 如果Point
是抽象的,并且具有Point<T>
包含的所有方法,则几乎没有什么区别。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.