给定两个类:
class BaseObject
{
}
class Some
{
public static implicit operator BaseObject(Some d)
{
Console.WriteLine("Some.implicit");
return new BaseObject();
}
}
我需要能够使用隐式运算符重载从 object(实际上是 Some)转换为 BaseObject。我使用了显式转换,但由于 InvalidCastException 而无法正常工作:
object obj = new Some();
var baseObject = (BaseObject)(obj); // InvalidCastException here
更新 对于那些不了解隐式转换的人。这有效:
Some obj = new Some();
BaseObject baseObject = obj; // writes "Some.implicit"
问题是我收到 obj 作为 object。
请您参考如下方法:
当源和目标类型在编译时已知时,转换的类型也在编译时确定。在这种情况下,BaseObject 派生自 object,因此从 object 到 BaseObject 的转换被视为典型的向下转换,如果在运行时确定该对象不是 BaseObject,则会失败。
要在运行时确定类型转换,您需要使用dynamic。
dynamic obj = new Some();
var baseObject = (BaseObject)obj; // works
或者如果obj的声明不能改变,
object obj = new Some();
var baseObject = (BaseObject)(dynamic)obj; // also works
