繁体   English   中英

从基础对象列表获取派生对象的属性

[英]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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM