我试图从类中获取对象(在我的例子中是一个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);
它确实有效但想法是这个类是未知的并且由字符串给出。
答案 0 :(得分:1)
你可以这样做:
object obj = Activator.CreateInstance(Type.GetType("Car")));
但是,由于您的Car
和Truck
类不共享公共类或接口,因此您只能使用object
作为obj
的类型,除非您提供类型等......但这样做毫无意义,也无法让你充满活力。
要解决,有多种方法,但这里是一个简单的方法,使用公共基类:
public class Base //<--- use a better name than that... lol
{
protected TabPage _Tab;
public TabPage ConfigurationTab { get { return _Tab; } }
public Base() {}
}
现在扩展Car and Truck的基类:
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>")));