C# 将对象强制转换为已知(但未知)类型

C# 将对象强制转换为已知(但未知)类型,c#,dynamic,casting,runtime,C#,Dynamic,Casting,Runtime,希望在运行时将对象强制转换为已知类型。我有一个类(为了方便称之为Item),它是Box的基类。框有它自己的属性,也有来自项的属性(显然) 基本上,我使用CreateInstance方法创建了一个Box实例,这将创建一个Object类型的对象,但真正的类型(如执行“typeof”时所见)是Box类型的。我需要在不硬编码任何开关/if等的情况下将此对象投射回框中。我必须测试的代码如下,我已经没有想法了 //Base Class using System; using System.Collectio

希望在运行时将对象强制转换为已知类型。我有一个类(为了方便称之为Item),它是Box的基类。框有它自己的属性,也有来自项的属性(显然)

基本上,我使用
CreateInstance
方法创建了一个Box实例,这将创建一个Object类型的对象,但真正的类型(如执行“typeof”时所见)是Box类型的。我需要在不硬编码任何
开关
/
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();
        }
    }
}
//基类
使用制度;
使用System.Collections.Generic;
使用System.Linq;
使用系统文本;
运用系统反思;
使用System.IO;
使用System.Xml;
使用System.Xml.Serialization;
名称空间Test11
{
公共类项目
{
公共int属性1{get;set;}
公共int属性2{get;set;}
公共int属性3{get;set;}
公共项目()
{
房地产1=1;
房地产2=2;
房地产3=3;
}
}
//Box类-从项继承
名称空间Test11
{
公共类框:项目
{
公共int属性4{get;set;}
公用信箱()
{
房地产4=4;
}
}
}
//应用程序类
名称空间Test11
{
班级计划
{
静态void Main(字符串[]参数)
{
List BaseList=新列表();
object obj=Assembly.getExecutionGassembly().CreateInstance(“Test11.Box”);
Type t=Type.GetType(“Test11.Box”);
//以下行不工作,需要使其工作:)
//基本列表。添加(obj作为t);
Console.WriteLine(t.ToString());
Console.ReadLine();
}
}
}

我现在已经尝试了许多不同的方法,上面的一种是其中之一。有什么想法或帮助吗?

您的
基本列表
需要
对象。您必须强制执行:

或:


您正在使用动态加载的程序集吗?如果您确实知道它将是Box,是否可以将Box声明为项附近的分部类,并在动态程序集中填写它的实现详细信息


不确定它是否有效,我没有尝试过那个特定的问题。

这是不可能的。除非您在代码中进行强制转换,否则它永远不会是类型为
Box
的强类型实例。但是,强制转换到
Item
应该足够了。只需将它强制转换到
Item
。您将能够将它传递给任何接受
Item的方法ode>,或者如果需要,可以稍后显式转换它。请解释一下为什么将
obj
转换为
Item
是不够的?将其转换为确切的类型并不会为
基本列表提供任何附加信息,因此似乎没有必要。我不明白的是,如果可以初始化列表,为什么不能你不能将其强制转换为物品吗?你在初始化列表时已经对物品进行了硬编码,你在寻找什么样的动态行为?@dasblinkenlight:我不能将obj强制转换为物品,因为我会从类框中释放属性4。我真的不能使用这些物品,它们都是硬编码的“物品”。如果我可以…BaseList.Add((typeof(obj)obj)要将obj对象动态转换为它的真实形式,那么它是完美的,但我不能:(.but
BaseList
需要
Item
对象。使用真实类型(只要它继承自
Item
)不会为您带来任何好处。
if (obj is Item)
    BaseList.Add((Item)obj);
if (typeof(Item).IsAssignableFrom(t))
    BaseList.Add((Item)obj);