C#,从字符串中调用类的实例

时间:2011-04-12 17:55:07

标签: c# string input instance

我一直在苦苦寻找一种从用户定义的输入中调用类实例的方法。

基本上我想调用已经定义的StandardVehicle类中的实例,但问题是我调用的实例的名称是由表单上的组合框上的用户选择定义的。 / p>

这就是我假设它将被格式化的方式,但是当我尝试调用实例,说我无法从字符串串行转换为StandardVehicle时,我收到错误。

        StandardVehicle VauxhallB = new StandardVehicle();
        VauxhallB.Model = "B";
        VauxhallB.Manufacturer = "Vauxhall";
        VauxhallB.Doors = 5;
        VauxhallB.HorsePower = 200;
        VauxhallB.Transmission = "Manual";
        VauxhallB.Year = 2009;
        VauxhallB.Cylinders = 6;
        VauxhallB.Seats = 7;
        VauxhallB.Price = 17000;
        VauxhallB.Registration = "abc1243";

        StandardVehicle objname = comboBox1.Text;

我假设它只是格式化字符串的情况,但我一直在搜索几个小时,无法弄清楚它需要用什么格式来定义它作为一个实例。

任何帮助都将不胜感激。

此致 S上。

6 个答案:

答案 0 :(得分:4)

不,这绝对不是仅仅格式化字符串的情况。听起来你想要一个

Dictionary<string, StandardVehicle>

将其填充到从字符串映射到对象,然后查找与用户指定的名称对应的对象。

答案 1 :(得分:1)

VauxhallB只是计算机的一个符号。用户不应该引用您的变量名称 - 尽管可能通过反射来实现,但这是编程的一个复杂方面。

更好的方法是将每个实例与Dictionary<string, StandardVehicle>中的字符串“name”相关联,然后查找。类似的东西:

Dictionary<string, StandardVehicle> nameMap = new Dictionary<string, StandardVehicle>();
nameMap["VauxhallB"] = VauxhallB;
StandardVehicle objname = nameMap[comboBox1.Text];

此外,如果您只对局部变量使用小写名称,那么它通常更具可读性,以便更好地将它们与类,公共方法和属性区分开来。

答案 2 :(得分:1)

除非您有

,否则无法将字符串转换为对象
  1. 获取字符串并创建所需对象的构造函数
  2. 显式/隐式转换运算符
  3. 和另一个选项

    使用Activator.CreateInstace

    第3个选项仅在字符串包含有效类型名称时有效,您可以执行

    示例
    Type type = Type.GetType(comboBox1.Text);
    StandardVehicle objname = Activator.CreateInstace(type);
    

    如果comboBox1.Text == "StandardVehicle",这将有效。

    此处提供更多信息:

    http://msdn.microsoft.com/en-us/library/w3f99sx1.aspx

    http://msdn.microsoft.com/en-us/library/wccyzw83.aspx

答案 3 :(得分:0)

试试这个:

StandardVehicle selectedObject = (StandardVehicle)comboBox1.SelectedItem;

当然,你的comboBox应该绑定到StandardVehicles的集合......如果不是,那就按照已经建议的方式去找Dictionary。

答案 4 :(得分:0)

首先,我还认为你的意思是反思,但你总是希望使用你的ClassVerhicle类。只需要通过用户收到的单个字符串设置属性。

给自己写一个构造函数。您可以定义单个字符串的格式,例如该字符串中的固定位置:

public StandardVehicle(String data)
{
    this.Model = data.Substring(0, 1);
    this.HorsePower = Int32.Parse(data.Substring(1, 4);
}

不太舒服但可能有效。添加一些错误处理。或XML加载或其他格式。

答案 5 :(得分:0)

它比你的样本复杂一点。我将从快速简便的方法开始,尽管IS快速而简单,但它是一种反模式,但我会在最后解释:

IBritishAuto car;

switch
{
    case "Vauxhall":
    {
        car = new Vauxhall(standardVehicle);    
        break;
    }
    case "Jaguar":
    {
        car = new Jaguar(standardVehicle);
    }
    ...etc.
}

这个次优的原因是每次要添加新的汽车类型时,都必须修改原始代码块,并冒险回归。如果您对此解决方案感到满意,并且不在乎,您现在可以停止阅读。

还在吗?

此模式称为“条件调度程序”。有两种主要策略可以改进它:重构一个Command模式(因为它是一个Gang of Four模式而被限制),或者更广泛地实现一个名为“控制反转”的概念。如果您有兴趣,请参阅以下Google条款:

“重构条件调度程序” “控制倒置”。

祝你好运。