切换子类型

本文关键字:类型 | 更新日期: 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();
    }
}

但无论如何 - 这是糟糕的设计,一般来说,你不应该有这样的东西。

我建议发布您的实际需求,您正在尝试做的事情以及所有细节,并要求更好的设计/解决方案。