2015-10-19 35 views
0

我們有類似下面的一些代碼:重鑄,其中兩種類型都有一個共同的基本類型

class Base 
    { 
     public string Name; 
    } 

    class DeeperBase : Base 
    { 
    } 

    class A : Base 
    { 
     public A() 
     { 
      Name = "A"; 
     } 
    } 

    class B : DeeperBase 
    { 
     public B() 
     { 
      Name = "B"; 
     } 
    } 

    static T Recast<T>(Base original) where T : Base, new() 
    { 
     if (!original.GetType().IsAssignableFrom(typeof(T))) 
      throw new InvalidCastException(); 
     return new T(); 
    } 

看起來Recast試圖檢查兩種類型都返回一個新T之前兼容。但是,該方法失敗,下面的代碼。

public static void Main(string[] args) 
    { 
     var a = new A(); 
     var b = Recast<B>(a); // exception 
    } 

什麼檢查Toriginal分享最大的共同基本類型(在這種情況下,Base)的正確方法?

+0

你想在這裏做什麼? –

+0

@Anton Gogolev在'Recast'中,有沒有辦法檢查'original'和'T'是否共享一個基類型?我覺得應該有辦法,如果拋出異常,我們必須做錯事。 – rookie

+0

您的重播方法。 (Base original)以這種方式聲明是一個具體類型,所以它失敗了,因爲你試圖傳遞具體類DeeperBase而不是Base類型。你也需要傳遞一個'通用'的。 – bilpor

回答

2

您正試圖將實例A轉換爲B,因爲它們不是相同的類型,A也不是從B派生的。

沒有辦法將A轉換爲B。你可以做一個Recast<Base>(a),但這沒有意義。請注意,您實際上沒有以任何方式更改類型,只是返回B的新實例,或者拋出異常。

+0

我們的代碼將所有對象存儲在「Base」類型的字典中。 'Recast'不應該返回一個'original'的類型,而是用字典中的'T'替換'original'。我想我不確定檢查應該做什麼,因爲'T'和'original'將始終共享'Base'。 – rookie

+0

定義「鑄造類型」。這裏沒有什麼用處。 –