例如,我有这个:
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?
答案 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());