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

时间:2014-04-01 16:56:00

标签: c# class object reflection properties

我试图从类中获取对象(在我的例子中是一个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 个答案:

答案 0 :(得分:1)

你可以这样做:

 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() {}

}

现在扩展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>")));