2014-04-01 63 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

尝试我发布的内容。 –

相关问题