2011-11-02 75 views
0

由於在C#中,類只能從一個類派生的,是有沒有辦法做這樣的事情:是否有一種不可知的方式將派生類轉換回其基類而不指定基類?

class Control 
{} 

class Button : Control 
{} 

class Slider : Control 
{} 

Button b = new Button(); 
Slider s = new Slider(); 

var base = (base) b; 
var base2 = CastToBase(s); 

我很好奇,因爲我希望能夠做到這一點不知道他們的基地類,例如在運行時。

+2

不要相信。你總是最終在System.Object。 – Plymouth223

+0

你應該看到:http://stackoverflow.com/questions/1524562/to-get-parent-class-using-reflection-on-c-sharp這可能會回答你的問題。 – Andre

+0

另外,你的意思是內置於語言或你可以寫的東西嗎? – Plymouth223

回答

2

它們只能從一個類派生,但這並不意味着任何基類都不是從另一個基類派生的,除非它是System.Object。如果你可以確定Base類(你可以使用反射)並且將它作爲基類(你可以使用反射),那麼你在運行時會獲得什麼?

如果您試圖訪問一個基類的方法/屬性在派生類中沒有提供,有可能是一個很好的原因,它不是在派生類型可用。如果你決定這樣做,我不認爲你需要投射它,你可以簡單地獲得基本類型,找到基本類型的方法/屬性並在派生類型上調用它們。

using System; 
using System.Reflection; 

namespace BaseTypetest 
{ 
    class Program 
    { 
     static void Main(string[] args) 
     { 
      BaseClass2 class2 = new BaseClass2(); 
      Console.WriteLine(class2.Value.ToString()); 
      Type baseClass = class2.GetType().BaseType; 
      Console.WriteLine(baseClass.FullName); 
      PropertyInfo info = baseClass.GetProperty("Value"); 
      if (info != null) 
      { 
       Console.WriteLine(info.GetValue(class2, null).ToString()); 
      } 
      Console.ReadKey(); 
     } 
    } 

    public class BaseClass1 : Object 
    { 
     public BaseClass1() 
     { 
      this.Value = 1; 
     } 

     public int Value { get; set; } 
    } 

    public class BaseClass2 : BaseClass1 
    { 
     public BaseClass2() 
     { 
      this.Value = 2; 
     } 
     public new int Value { get; set; } 
    } 
} 

結果:

2 
BaseTypetest.BaseClass1 
1 
+0

謝謝,對不起,我的意思是直接基類的類型,運行時做一些動態的東西,這是非常有用的。 –

+0

你還沒有提到你爲什麼需要施放它。回答WHY會給你更多的答案,並且可能是你需要的答案而不需要上課。 –

+0

是的,我並沒有這麼想,因爲我以爲你看到了我對這個問題的最後一個補充評論:「當你想在運行時做一些動態的東西時很有用,比如檢查一個值的基類的所有屬性並顯示它們等等。「基本上需要在運行時檢查一個值的基類 –

2

您可以通過反射來獲取對象的BaseType

something.GetType().BaseType 

隨着該Type對象,可以在運行時動態投放。

不過,我強烈反對這一點。它會減慢你的代碼,也沒有編譯器檢查類型。

如果您需要此把它放在一個IList<BaseType>,你已經可以做到這一點。

+1

謝謝,得到那個類型後,你如何在運行時拋出它? –

0

根據您正試圖解決(例如,防止接受用戶輸入,這是依賴於通過控制執行不同的方式處理所有的控制)的問題,最好的辦法可能是創建和實施所需的接口工作單位。

我們廣泛使用的接口,在我們的應用中明確,使我們不必擔心給定的控制如何實現,我們從它需要的功能。它需要更多的配置,但從長遠來看,這是值得的。

相關問題