希望在运行时将Object强制转换为已知类型。我有一个类(简称为Item),它是Box的基类。 Box有它自己的属性以及Item中的属性(显然)。
基本上我使用CreateInstance
方法创建Box的实例,这会创建一个Object类型的Object,但真正的类型(在执行'typeof'时见证)是Box类型。我需要将此Object转换回Box而不对任何switch
/ if
等进行硬编码。我必须测试的代码如下所示,我的想法已经用完了。
//Base Class
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Reflection;
using System.IO;
using System.Xml;
using System.Xml.Serialization;
namespace Test11
{
public class Item
{
public int property1 { get; set; }
public int property2 { get; set; }
public int property3 { get; set; }
public Item()
{
property1 = 1;
property2 = 2;
property3 = 3;
}
}
//Box Class - Inherits from Item
namespace Test11
{
public class Box : Item
{
public int property4 { get; set; }
public Box()
{
property4 = 4;
}
}
}
//Application Class
namespace Test11
{
class Program
{
static void Main(string[] args)
{
List<Item> BaseList = new List<Item>();
object obj = Assembly.GetExecutingAssembly().CreateInstance("Test11.Box");
Type t = Type.GetType("Test11.Box");
//The following line does not work, need to make it work :)
//BaseList.Add(obj as t);
Console.WriteLine(t.ToString());
Console.ReadLine();
}
}
}
我现在尝试了很多不同的方法,上面提到的方法就是其中之一。有什么想法或帮助吗?
答案 0 :(得分:2)
您的BaseList
期待Item
个对象。你有来施放:
if (obj is Item)
BaseList.Add((Item)obj);
或者:
if (typeof(Item).IsAssignableFrom(t))
BaseList.Add((Item)obj);
答案 1 :(得分:0)
您是否正在使用动态加载的程序集?如果您确定它将是Box,您是否可以将Box声明为Item附近的部分类并在动态程序集中填写它的实现细节?
不确定它是否有用,我没有尝试过这个特定问题。