我有以下类的示例结构:
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
,您对如何解决此问题有任何想法吗?
答案 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();
}
}
但无论如何 - 这是糟糕的设计,一般来说,你不应该有这样的东西。
我建议发布您的实际需求,您正在尝试做的事情,以及所有细节,并要求更好的设计/解决方案。