(“Child Class”是“Parent class”)
我有一个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是所提供的食品种类的从来都不是错误,以便里面的代码是不可达。任何想法这个东西有什么问题,我该如何解决它?
据我所见,问题在于你的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
}
这是正确的@@。仍然没有得到IsAssignableFrom。你可以点亮我吗? – 2014-10-08 07:08:46
@TreeNguyen我已经添加了一个解释,我希望这有助于。 – Dirk 2014-10-08 07:17:24
这很清楚:)。 Tq这么多:) – 2014-10-08 07:24:25
我有一个字典为我返回类型,所以我不认为这是问题: - ? – 2014-10-08 06:50:08
你需要思考得到这个工作。
首先获得实际类型热狗:
Type t = Type.GetType("MyNamespace.HotDog");
现在创建这种类型的新实例:
HotDog instance = (HotDog) Activator.CreateInstance(t);
注意,这将调用默认的构造函数。如果您需要参数化,则使用Activator#CreateInstance(t, object[])
代替。
为什么在直接访问,创建和调用类型时使用反射 – 2014-10-08 06:41:54
嗯,它也可以在没有Type.GetType的情况下正常工作,但无论如何它的反射在使用激活器时......但是我专注于OPs文章本身他使用字符串来获取实际的类型。 – HimBromBeere 2014-10-08 06:47:14
问题是因为HotDog是一种食物,所以我想尝试如果(t是食物)。但它永远不会回报真实! – 2014-10-08 06:49:02
以下可能是一种更简单的方法来检查内部类型是否为Food类型(使用as运算符),它检查是否可以将一种类型转换成基类型
Type t = typeof("Hot Dog");
Food isFood = t as Food;
if(isFood != null)
{
Food f = (Food)Food.CreateOne (t);
}
'Hot Dog'!='HotDog'。 – 2014-10-08 06:31:48