如何获取给定字符串名称的类和属性
本文关键字:属性 字符串 何获取 获取 | 更新日期: 2023-09-27 17:56:04
我正在尝试从类中获取对象(在我的例子中是 TabPage),但类名是字符串给出的。 我在下面为我想要得到的东西做了一个基本的例子。 我尝试使用反射并且可以获取属性信息,但是如何获取实际对象。
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);
它确实有效,但想法是该类未知并由字符串给出。
你可以
这样做:
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() {}
}
现在扩展汽车和卡车的基类:
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>")));