有没有办法在运行时将所需的类对象转换为另一个,而不直接在.net中强制转换?

时间:2012-06-25 05:43:13

标签: .net object casting runtime

例如,我有这个:

class BasePacket
{
   int header;
   int type;
}

class ChildPacket1 : BasePacket
{
   //...
}

class ChildPacket2 : BasePacket
{
   //...
}

BasePacket bp;
Type t;
object obj = CreateNeededChildPacket(out t); //return one of childs as object and it's real type
bp = ...// anyway to cast obj to type represented by t? or by using something else?

2 个答案:

答案 0 :(得分:4)

Convert.ChangeType可以非常有效地处理各种类型转换方案,包括这一方案,具体如下:

  

读者必须明白Convert.ChangeType()仅适用于   某些标准的.NET系统类型。它不适用于任何人   没有实现IConvertible的组件,它不起作用   对于自定义类型。

float f = 1.1f;
int i;
Type t = typeof(int);
i = (int)Convert.ChangeType(f, t);
Console.WriteLine(i);

请注意,在您的特定示例中,在两个值类型之间进行转换时,ChangeType将不如直接转换效率高,因为ChangeType会返回作为对象装箱的整数值。

如果ChangeType实施IConvertable,您可以将public class MyClass : IConvertible { public float MyFloatValue { get; set; } int IConvertible.ToInt32(IFormatProvider provider) { return (int)MyFloatValue; } // TODO: Implement the rest of IConvertable } MyClass myClass = new MyClass() { MyFloatValue = 42.42f }; i = (int) Convert.ChangeType(myClass, t); Console.WriteLine(i); 用于自己的类,例如

{{1}}

答案 1 :(得分:1)

在你的例子中,你创建了两个派生类中的一个并将它存储在一个基本变量中...这根本不需要任何转换,因为按照继承法则这样做完全没问题。基类型变量总是可以被赋予更多的派生对象,因为基类能够做到的任何事情都可以保证派生类也能做到,所以它是安全的。例如,数学老师可以执行普通教师可以执行的任何操作(例如GradePapers())。使用Teacher变量指向Math Teacher对象是安全的。

BasePacket bp = (BasePacket) CreateNeededChildPacket();

修改 在回复您的注释时,理想情况下,您将使CreateNeededChildPacket()方法返回BasePacket类型(如果返回的对象始终从BasePacket中删除)。就像一个基本参数可以接受派生对象一样,基本返回类型可以返回一个派生对象,这就是继承之美。对于那些打电话给你的方法的人来说,这会更加安全。

BasePacket CreateNeededChildPacket() 
{
    // do something
    return AnyObjectThatDerivesFromBasePacket;    
}

如果您无法更新方法,那么您可以添加一些额外的类型检查以确保安全。

object obj = CreateNeededChildPacket();
BasePacket bp = null;

if (obj is BasePacket) 
   bp = (BasePacket) obj;
else
   throw new Exception("Object was not a valid BasePacket type: " + obj.GetType.ToString());