将Object强制转换为已知(但未知)类型

本文关键字:未知 类型 Object 转换 | 更新日期: 2023-09-27 18:16:27

希望在运行时将对象强制转换为已知类型。我有一个类(为方便起见叫它Item),它是Box的基类。Box有它自己的属性,也有Item的属性(很明显)。

基本上,我使用CreateInstance方法创建了一个Box的实例,这创建了一个Object类型的对象,但真正的类型(当执行'typeof'时看到的)是Box类型。我需要在没有硬编码任何switch/if等的情况下将此对象转换回Box。下面是我必须测试的代码,我已经没有想法了。

//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();
        }
    }
}
我现在已经尝试了很多不同的方法,上面的方法是其中之一。有什么想法或帮助吗?

将Object强制转换为已知(但未知)类型

您的BaseList正在等待Item对象。你 cast:

if (obj is Item)
    BaseList.Add((Item)obj);

或:

if (typeof(Item).IsAssignableFrom(t))
    BaseList.Add((Item)obj);

您正在使用动态加载的程序集吗?如果您确定它将是Box,您是否可以将Box声明为Item附近的部分类,并在动态程序集中填充它的实现细节?

不确定它是否会工作,我还没有尝试过那个特殊的问题。