正在将类型转换为父类型

本文关键字:父类 类型 类型转换 | 更新日期: 2023-09-27 18:22:14

我有两个类,一个是抽象的,另一个是继承它的

public abstract class Monitor {
   public SmallMonitor MiniMonitor { get; set;}
   public abstract bool Execute();
}
public class ToolBox1000 : Monitor
{
    //implements Monitor
    public ToolBox1000()
    {
        SmallMonitor monitor = new SmallMonitor();
        monitor.Test = true;
        monitor.Number = 1230;
    }
}
public class ToolBox2000 : Monitor
{
   //implements Monitor
    public ToolBox2000()
    {
        SmallMonitor monitor = new SmallMonitor();
        monitor.Test = true;
        monitor.Number = 2034;
    }
}

我的问题是,我需要获得使用反射实现Monitor的所有类的列表,然后将它们添加到我需要返回的列表中。。

public static IEnumerable<Monitor> Monitors
{
    get
    {
        List<Monitor> monitors = new List<Monitors>();
        List<Type> classes = GetClasses(typeof(Monitor)).OrderBy(x => x.Name).ToList();
        foreach(Type c in classes)
        {
            object oMonitor = Convert.ChangeType(c, typeof(Monitor)).GetType();
            Monitor mig = (Monitor)oMonitor;
            monitors.Add(mig);
        }
        return monitors;
    }
}
private static List<Type> GetClasses(Type baseType)
{
    return Assembly.GetCallingAssembly().GetTypes().Where(type => type.IsSubclassOf(baseType)).ToList();
}

问题是我在这行中得到了一个无效的强制转换

  object oMonitor = Convert.ChangeType(c, typeof(Monitor)).GetType();

我需要实现IConvertible

我不知道如何做到这一点,我试了好几次都没有成功,这能做到吗?

正在将类型转换为父类型

您正在尝试将类Type的实例转换为类Monitor的实例,这是不可能的。据我所知,您正试图创建该类型的实例,并将其添加到监视器列表中

基于一些假设,您可以尝试以下代码

    public static IEnumerable<Monitor> Monitors
    {
        get
        {
            List<Monitor> monitors = new List<Monitor>();
            List<Type> classes = GetClasses(typeof(Monitor)).OrderBy(x => x.Name).ToList();
            foreach (Type c in classes)
            {
                object oMonitor = Activator.CreateInstance(c);
                Monitor mig = (Monitor)oMonitor;
                monitors.Add(mig);
            }
            return monitors;
        }
    }

注意更改的线路object oMonitor = Activator.CreateInstance(c);

Activator.CreateInstance将创建给定类型的实例,前提是该实例不是抽象的,并且具有无公共参数的构造函数。