如何获取给定字符串名称的类和属性

本文关键字:属性 字符串 何获取 获取 | 更新日期: 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")));

但是,由于您的CarTruck类不共享公共类或接口,因此您只能使用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>")));