(“儿童班”是“家长班”)

时间:2014-10-08 06:25:16

标签: c#

我有一个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类型,所以里面的代码是无法访问的。知道这件事有什么问题,我该如何解决呢?

3 个答案:

答案 0 :(得分:3)

你试过吗

 Type t = typeof(HotDog)

另见Type Checking: typeof, GetType, or is?

答案 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
}