2014-04-01 114 views
0

我想從類中獲取對象(在我的情況下是TabPage),但類名是以字符串的形式給出的。我已經做了一個基本的例子,下面是我想要得到的。我曾嘗試使用反射,可以得到PropertyInfo但我如何得到實際的對象。如何獲得給定字符串名稱的類和屬性

public Form1() 
{ 

    string TabName = "Car"; 
    InitializeComponent(); 
    /* 
* Need the ability to get Class from string Name then get ConfigurationTab from that class 
* PropertyInfo[] propertyInfo = Assembly.GetExecutingAssembly().GetTypes().Where(t => t.Name == TabName).FirstOrDefault().GetProperties(); 
*/ 
} 

public class Car 
{ 

    public TabPage _Tab; 
    public TabPage ConfigurationTab { get { return _Tab; } } 
    public Car() 
    { 
     _Tab = new TabPage("Car"); 
     _Tab.BackColor = Color.Red; 
    } 
} 

public class Truck 
{ 

    public TabPage _Tab; 
    public TabPage ConfigurationTab { get { return _Tab; } } 
    public Truck() 
    { 
     _Tab = new TabPage("Truck"); 
     _Tab.BackColor = Color.Blue; 
    } 
} 

我已經試過了如下代碼:

Car car = new Car(); 
TabPage tp = (TabPage)propertyInfo[0].GetValue(car, null); 

和它的工作,但這個想法是類是未知的,由字符串給出。

回答

1

你可以這樣做:

object obj = Activator.CreateInstance(Type.GetType("Car"))); 

但是因爲你的CarTruck類不共用一個類或接口只能使用objectobj類型,除非你套管類型等..但那是毫無意義的,不會讓你動態創作。

要解決,有多種方法,但這裏是一個簡單的,使用公共基類:

public class Base //<--- use a better name than that... lol 
{ 

    protected TabPage _Tab; 

    public TabPage ConfigurationTab { get { return _Tab; } } 

    public Base() {} 

} 

現在擴展基類的汽車和卡車:

public class Car : Base 
{ 

    public Car() 
    { 
     _Tab = new TabPage("Car"); 
     _Tab.BackColor = Color.Red; 
    } 
} 

public class Truck : Base 
{ 

    public Truck() 
    { 
     _Tab = new TabPage("Truck"); 
     _Tab.BackColor = Color.Blue; 
    } 
} 

現在變化您的激活器:

Base base = (Base) Activator.CreateInstance(Type.GetType("<TheClassToCreate>"))); 
+0

以下是我嘗試的: object obj = Activator.CreateInstance(Type.GetTy pe(「Test.Form1 +」+ TabName)); 但正如所指出的,這給了我的對象「汽車」在我的情況。我需要訪問TabPage,不能用對象來做到這一點。 如果我添加一個可以由汽車和卡車繼承的接口,我該如何去做這件事? –

+0

將添加到我的答案... –

+0

嘗試我發佈的內容。 –

相關問題