切换子类型
本文关键字:类型 | 更新日期: 2023-09-27 18:34:15
我有以下类结构示例:
public class Base
{
}
public class Child1 : Base
{
}
public class Child2 : Base
{
}
我想做一些黑魔法:
Base @base = new Child2(); //note: there @base is declared as Base while actual type is `Child2`
var child1 = (Child1) @base;
它按预期System.InvalidCastException
失败。
然后我添加了隐式强制转换运算符到Child2
:
public class Child2 : Base
{
public static implicit operator Child1(Child2 child2)
{
return new Child1();
}
}
并且代码仍然抛出相同的异常(显式运算符也无济于事)。
您是否有任何想法如何在不使用dynamic
,自定义强制方法或将局部变量@base
声明为Child2
的情况下修复此行为?
你已经在 Child2 中实现了隐式强制转换,但实际上正试图从基地投射。
应首先将其强制转换为 Child2,以便应用到 Child1 的隐式转换:
var child1 = (Child1)(Child2)base;
或
Child1 child1 = (Child2)base;
如果您不知道类型:
var child1 = base is Child1 ? (Child1)base : (Child1)(Child2)base;
var child2 = base is Child2 ? (Child2)base : (Child2)(Child1)base;
完全不同的方法是:
public class Base
{
public T As<T>() where T : Base, new()
{
return this as T ?? new T();
}
}
但无论如何 - 这是糟糕的设计,一般来说,你不应该有这样的东西。
我建议发布您的实际需求,您正在尝试做的事情以及所有细节,并要求更好的设计/解决方案。