切换子类型

时间:2012-05-16 11:28:08

标签: c# inheritance

我有以下类的示例结构:

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,您对如何解决此问题有任何想法吗?

1 个答案:

答案 0 :(得分:2)

你在Child2中实现了一个隐式转换, 但实际上是试图从Base施放。

您应首先将其强制转换为Child2,以便隐式转换为Child1:

var child1 = (Child1)(Child2)base;

OR

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();
    }
}

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

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