2012-05-16 14 views
0

我有以下的類實例結構:開關亞型

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,自定義投射方法或聲明局部變量@baseChild2,您有任何想法如何解決此問題嗎?

+0

那麼,你明確地投下了對象。因此定義一個明確的運算符,而不是隱式的。 –

+0

@Shedal,沒有幫助。 – hazzik

回答

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

但無論如何 - 這是不好的設計,一般來說,你不應該有這樣的東西。

我建議發佈你的實際需求,你正在嘗試做的事情,所有的細節,並要求一個更好的設計/解決方案。

+0

不幸的是我不知道@base的實際類型是什麼。 – hazzik

+0

@hazzik請參閱編輯。此外,如果兩個邏輯上都應該在彼此之間進行隱式轉換,則可以將該邏輯實施爲Base內部的隱式強制類型轉換爲Child1和Child2。這樣,您可以將Child2轉換爲Child1,將Child1轉換爲Child2,將基礎轉換爲Child1,將基礎轉換爲Child2,以及顯然將Child1/2轉換爲基礎。 – SimpleVar

+0

*將隱式轉換運算符移動到Base *是不可能的(參數或返回類型必須是「Base」類型)+轉換爲派生類... BAM –