(“子类”是“父类”)
本文关键字:父类 子类 | 更新日期: 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
}