将对象转换为已知(但未知)类型

时间:2011-12-01 16:23:08

标签: c# dynamic casting runtime

希望在运行时将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();
        }
    }
}

我现在尝试了很多不同的方法,上面提到的方法就是其中之一。有什么想法或帮助吗?

2 个答案:

答案 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附近的部分类并在动态程序集中填写它的实现细节?

不确定它是否有用,我没有尝试过这个特定问题。