(“子类”是“父类”)

本文关键字:父类 子类 | 更新日期: 2023-09-27 18:25:50

我有一个HotDog类作为Food类的子类。

public class HotDog : Food
{
    public HotDog () : base ("hotdog", new string[] { "bread", "meat"}, new int[] { 1, 1 }, 0.7)
    {
    }
}

我试着做这个

Type t = typeof("HotDog");
if (t is Food) {
    Food f = (Food)Food.CreateOne (t);
}

这是我的CreateOne方法

public static Consumables CreateOne (Type t)
{
    return (Consumables)Activator.CreateInstance (t);
}

但我得到的错误是,t从来都不是提供的Food类型,所以里面的代码是不可访问的。知道这个东西出了什么问题吗?我该怎么修?

(“子类”是“父类”)

你试过吗

 Type t = typeof(HotDog)

另请参见类型检查:typeof、GetType或is?

您需要反射才能使其工作。

首先获取实际类型HotDog:

Type t = Type.GetType("MyNamespace.HotDog");

现在创建一个这种类型的新实例:

HotDog instance = (HotDog) Activator.CreateInstance(t);

请注意,这将调用默认构造函数。如果您需要参数化的,请使用Activator#CreateInstance(t, object[])

在我看来,问题在于if语句。

Type t = typeof(...);
if (t is Food) { ... }

is运算符检查左表达式的类型是否是右表达式的有效值。

换句话说,您正在检查t的类型(即Type)是否是Food类的有效值,当然不是。

您可以使用Type.IsAssignableFrom:

if (typeof(Food).IsAssignableFrom(t)) { ... }

IsAssignableFrom确定t类型的实例是否可以分配给typeof(Food)类型的变量,即如果返回true,则可以执行

Hotdog h;
Food f;
if (typeof(Food).IsAssignableFrom(typeof(Hotdog))
{
    f = h; // you can assign a Hotdog to a Food
}
// this would return false for your classes
if (typeof(Hotdog).IsAssignableFrom(typeof(Food))
{
    h = f; // you can assign a Food to a Hotdog
}