2014-10-08 194 views
0

我有一个HotDog类作为Food类的一个子类。(“Child Class”是“Parent 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是所提供的食品种类的从来都不是错误,以便里面的代码是不可达。任何想法这个东西有什么问题,我该如何解决它?

+1

'Hot Dog'!='HotDog'。 – 2014-10-08 06:31:48

回答

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 
} 
+0

这是正确的@@。仍然没有得到IsAssignableFrom。你可以点亮我吗? – 2014-10-08 07:08:46

+0

@TreeNguyen我已经添加了一个解释,我希望这有助于。 – Dirk 2014-10-08 07:17:24

+0

这很清楚:)。 Tq这么多:) – 2014-10-08 07:24:25

1

你需要思考得到这个工作。

首先获得实际类型热狗:

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

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

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

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

+0

为什么在直接访问,创建和调用类型时使用反射 – 2014-10-08 06:41:54

+0

嗯,它也可以在没有Type.GetType的情况下正常工作,但无论如何它的反射在使用激活器时......但是我专注于OPs文章本身他使用字符串来获取实际的类型。 – HimBromBeere 2014-10-08 06:47:14

+0

问题是因为HotDog是一种食物,所以我想尝试如果(t是食物)。但它永远不会回报真实! – 2014-10-08 06:49:02

0

以下可能是一种更简单的方法来检查内部类型是否为Food类型(使用as运算符),它检查是否可以将一种类型转换成基类型

Type t = typeof("Hot Dog"); 

Food isFood = t as Food; 

if(isFood != null) 
{ 
    Food f = (Food)Food.CreateOne (t); 
}