我有一个HotDog课程,作为Food class的孩子。
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类型,所以里面的代码是无法访问的。知道这件事有什么问题,我该如何解决呢?
答案 0 :(得分:3)
答案 1 :(得分:1)
你需要反思才能让它发挥作用。
首先获取实际类型HotDog:
Type t = Type.GetType("MyNamespace.HotDog");
现在创建一个这种类型的新实例:
HotDog instance = (HotDog) Activator.CreateInstance(t);
请注意,这将调用default-constructor。如果您需要参数化,请改用Activator#CreateInstance(t, object[])
。
答案 2 :(得分:0)
据我所知,问题在于你的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
}