【问题标题】:How to get class and property given string name如何获取给定字符串名称的类和属性
【发布时间】:2014-05-12 14:20:34
【问题描述】:

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

它确实有效,但想法是该类是未知的并且由字符串给出。

【问题讨论】:

    标签: c# class object reflection properties


    【解决方案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 和 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>")));
    

    【讨论】:

    • 这是我尝试过的: object obj = Activator.CreateInstance(Type.GetType("Test.Form1+" + TabName));但如前所述,在我的情况下,这给了我对象“汽车”。我需要访问 TabPage,不能用对象做到这一点。如果我添加一个 Car 和 Truck 都可以继承的接口,我该怎么做?
    • 我在构造函数中设置了 _Tab
    • 这行得通:public Form1() { string TabName = "Car";初始化组件(); Vehicle 车辆 = (Vehicle)Activator.CreateInstance(Type.GetType("Test.Form1+" + TabName)); tabControl1.TabPages.Add(vehicle.ConfigurationTab); } 公共类车辆 { 受保护的 TabPage _Tab; public TabPage ConfigurationTab {get { return _Tab;}} } public class Car : Vehicle { public Car() { _Tab = new TabPage("Car"); _Tab.BackColor = 颜色.红色; } } 公共类卡车 : Vehicle { public Truck() { _Tab = new TabPage("Truck"); _Tab.BackColor = 颜色.蓝色; } }
    猜你喜欢
    • 1970-01-01
    • 2011-04-12
    • 2012-01-09
    • 2020-07-16
    • 1970-01-01
    • 2014-06-27
    • 2014-03-06
    • 1970-01-01
    • 2013-02-11
    相关资源
    最近更新 更多