C# 使用名称强制转换对象

C# 使用名称强制转换对象,c#,casting,object-type,C#,Casting,Object Type,我需要使用文字字符串名称将不同的对象强制转换为不同的类型。一些示例代码: string controlName = "Control"; string stringName = "string"; string panelName = "Panel"; var x = Panel(); ((Control)x).Name = "SomeName"; 上面的代码当然有效,但不是这一行 ((Control)x).Name = "Normal"; 我怎么用电话线 ((controlName)

我需要使用文字字符串名称将不同的对象强制转换为不同的类型。一些示例代码:

string controlName = "Control";
string stringName = "string";
string panelName = "Panel";

var x = Panel();

((Control)x).Name = "SomeName";
上面的代码当然有效,但不是这一行

 ((Control)x).Name = "Normal";
我怎么用电话线

((controlName)x).Name = "Awesome";
我希望这是有道理的,但如果我需要进一步解释,我可以试试

我正在创建一系列在xml模式中定义的问题。问题会有所不同,例如 1.这是什么时候发生的。 2为什么会发生这种情况。 3.这是什么类型的(类型1,类型2,类型3)

所有这些都由一个基本控件读取。1需要答案控件作为日期时间选择器,2需要文本框,3需要组合框

我将订阅textbox的textchange事件、datetimepicker的value changed事件和combobox的selectedindexchange事件

这太简单了,我实际上是在使用控件和创建事件

我现在的处理方式,是一个巨大的案例陈述。我想知道是否有更简单的方法将控件转换为xml文档中定义的类型(字符串值)

编辑*

按要求编码

namespace ScriptControl
{
 public partial class ScriptItem
 {
    public FollowupEvent ActiveEvent{get;set;}

    public event EventHandler AnswerChanged;

    #region Constructors

    public ScriptItem()
    {
    }

    public ScriptItem(DataRow row)
    {
    }

    public ScriptItem(XElement xelem,FollowupEvent activeEvent,int instanceID)
    {
        ActiveEvent = activeEvent;

        InstanceID = instanceID;

        try
        {
            Question = xelem.Elements("Text").First().Value.ToString();
            AnswerType = xelem.Elements("Type").First().Value.ToString();
            ControlType = xelem.Elements("Control").First().Attribute("Type").Value.ToString();
            ActivityID = Convert.ToInt32(xelem.Attribute("ID").Value.ToString());
            ScriptItemType = xelem.Elements("ScriptItemType").First().Value.ToString();
            ScriptItemQuestionType = xelem.Elements("QuestionType").First().Value.ToString();
            InputControl = ConfigureInputControl(xelem.Elements("Control").First().Attribute("Type").Value.ToString());
            QuestionControl = ConfigureQuestionControl(xelem.Elements("Control").First().Attribute("Type").Value.ToString());
            Prompt = xelem.Elements("Prompt").First().Value.ToString();
        }
        catch { }
    }
    #endregion

    #region Public Properties

    public string Prompt { get; set; }

    public Panel QuestionPanel = new Panel();

    public int ActivityID { get; set; }

    public string Question { get; set; }

    public string AnswerType { get; set; }

    public object Result { get; set; }

    public Control InputControl { get; set; }

    public string ControlType { get; set; }

    public Control QuestionControl { get; set; }

    public string ScriptItemType { get; set; }

    public string ScriptItemQuestionType { get; set; }

    public int InstanceID { get; set; }

    public ScriptControl.Entities.ScriptControlBase ScriptBaseControl { get; set; }

    #endregion

    public Control ConfigureInputControl(string controlType)
    {
        switch (controlType)
                {
                    case "Checkbox":
                    InputControl = new CheckBox();
                    break;

                    case "BooleanQuestion":
                    InputControl = new BooleanQuestion();
                    ((BooleanQuestion)InputControl).AnswerChanged += ScriptItem_AnswerChanged;
                    ((BooleanQuestion)InputControl).SetQuestion(Question);
                    break;

                    case "TextBox":
                    InputControl = new TextBox();
                    ((TextBox)InputControl).KeyDown += ScriptItem_AnswerChanged;
                    break;

                    case "RadioButton":
                    InputControl = new RadioButton();
                    break;

                    case "DropDown":
                    InputControl = new RadioButton();
                    break;

                    case "DateTimePicker":
                    InputControl = new DateTimePicker();
                    ((DateTimePicker)InputControl).KeyDown += ScriptItem_AnswerChanged;
                    break;

                   case ".CustomControls.SmartParts.CauseForRepair":
                   case".CustomControls.SmartParts.Airlines":
                   case ".CustomControls.SmartParts.DREntry":
                        InputControl = GetUIControl();
                        ((FN_ControlBase)InputControl).PropertyChanged += ScriptItem_AnswerChanged;
                       break;
    }
        return InputControl;
    }

    private void ScriptItem_AnswerChanged(object sender, EventArgs e)
    {
        Dictionary<string, object> workFlowParams = new Dictionary<string, object>();

        switch (ControlType)
        {
            case "BooleanQuestion":
                Control x = ((Control)sender).Parent.Parent.Parent;

                Result = ((BooleanQuestion)x).Answer;

                workFlowParams.Add("QuestionID",Activity);
                workFlowParams.Add("InstanceID", InstanceID);
                workFlowParams.Add("Result",Result);
            break;

            case "TextBox":
                if (((KeyEventArgs)e).KeyValue == 13)
                {
                    Result = ((TextBox)sender).Text;

                    workFlowParams.Add("QuestionID", Activity);
                    workFlowParams.Add("InstanceID", InstanceID);
                    workFlowParams.Add("Result", Result);
                }
                break;

            case "DateTimePicker":
                if (((KeyEventArgs)e).KeyValue == 13)
                {
                    Result = ((DateTimePicker)sender).Text;

                    workFlowParams.Add("QuestionID", Activity);
                    workFlowParams.Add("InstanceID", InstanceID);
                    workFlowParams.Add("Result", Result);
                }
                break;

            case ".CustomControls.SmartParts.Airlines":
            case ".CustomControls.SmartParts.CauseForRepairUI":
            case ".CustomControls.SmartParts.CancelCallUI":
            case ".CustomControls.SmartParts.CostCenter":
            case ".CustomControls.SmartParts.ReadyToBill":
            case ".CustomControls.SmartParts.TemporaryFix":
            case ".CustomControls.SmartParts.BrakeRepairFollowup":
            case ".CustomControls.SmartParts.DREntry":
            default:
                if (((PropertyChangedEventArgs)e).PropertyName == "WorkComplete" & Convert.ToBoolean(((.CustomControls.FN_ControlBase)sender).GetPropertyValue("WorkComplete")) == true)
                {
                    foreach (var propty in ((.CustomControls.FN_ControlBase)sender).GetType().GetProperties())
                    {
                        if (ActiveEvent.HasProperty(propty.Name) & propty.Name != "EventID")
                        {
                            ActiveEvent.SetPropertyValue(propty.Name, ((Control)sender).GetPropertyValue(propty.Name));
                        }
                    }
                }

                workFlowParams.Add("QuestionID", Activity);
                workFlowParams.Add("InstanceID", InstanceID);
                workFlowParams.Add("Result", ActiveEvent);
                break;
        }

        AnswerChanged(workFlowParams, e);
    }

    public Control ConfigureQuestionControl(string controlType)
    {
        switch (controlType)
        {
            case "BooleanQuestion":
                ((BooleanQuestion)InputControl).SetQuestion(Question);
                break;

            case "TextBox":
                QuestionControl = new Label { Visible = true, Location = new Point(0, 0), Text = Question};
                break;

            case "DateTimePicker":
                QuestionControl = new Label { Visible = true, Location = new Point(0, 0), Text = Question};
                break;
        }

        return QuestionControl;
    }

    public Control ConfigureControl()
    {
        var height = 0;
        var width = 0;

        ScriptBaseControl = new ScriptControl.Entities.ScriptControlBase();

        if (InputControl is BooleanQuestion || ScriptItemType == "Control")
        {
            InputControl = ConfigureInputControl(ControlType);

            ScriptBaseControl.AddControl(InputControl);

            ScriptBaseControl.SetPrompt(Prompt);

            foreach (Control c in ScriptBaseControl.FilterControls(ctl => !(ctl is Panel) && !(ctl is FlowLayoutPanel) && !(ctl is GroupBox) && !(ctl is ScriptControlBase)))
            {
                height = height + c.Height;
                if (c.Width > width)
                {
                    width = c.Width;
                }
            }

            ScriptBaseControl.Size = new Size(width, height);
        }
        else
        {
            FlowLayoutPanel x = new FlowLayoutPanel();

            x.Controls.Add(QuestionControl);

            x.Controls.Add(InputControl);

            foreach (Control c in ScriptBaseControl.FilterControls(ctl => !(ctl is Panel) && !(ctl is FlowLayoutPanel) && !(ctl is GroupBox) && !(ctl is ScriptControlBase)))
            {
                height = height + c.Height;
                if (c.Width > width)
                {
                    width = c.Width;
                }
            }

            x.Size = new Size(width, height);

            ScriptBaseControl.Size = x.Size;

            ScriptBaseControl.AddControl(x);

            ScriptBaseControl.SetPrompt(Prompt);
        }
        return ScriptBaseControl;
    }

    private Control GetUIControl()
    { 
        Control uiControl = new Control(); 

        switch (ControlType)
          {
              case ".CustomControls.SmartParts.Air":
                  uiControl = new .CustomControls.SmartParts.Airlines(ActiveEvent.EventID) { ExternalSave = true};
               break;

            case ".CustomControls.SmartParts.CauseFor":
               uiControl = new .CustomControls.SmartParts.CauseForRepairUI() { ExternalSave = true };
                break;

            case ".CustomControls.SmartParts.Cancel":
                uiControl = new .CustomControls.SmartParts.CancelCallUI() { ExternalSave = true,EventID = ActiveEvent.EventID };
                break;

            case ".CustomControls.SmartParts.Cost":
                uiControl = new .CustomControls.SmartParts.CostCenter() { ExternalSave = true};
                break;

            case ".CustomControls.SmartParts.ReadyTo":
                uiControl = new .CustomControls.SmartParts.ReadyToBill(ActiveEvent.EventID) { ExternalSave = true, EventID = ActiveEvent.EventID };
                break;

            case ".CustomControls.SmartParts.Temporary":
                uiControl = new .CustomControls.SmartParts.TemporaryFix() { ExternalSave = true};
                break;

            case ".CustomControls.SmartParts.RepairFollowup":
                uiControl = new .CustomControls.SmartParts.BrakeRepairFollowup() { ExternalSave = true, EventID = ActiveEvent.EventID};
                break;

            case ".CustomControls.SmartParts.Entry":
                uiControl = new .CustomControls.SmartParts.DREntry() { ExternalSave = true };
                break;
        }

        return uiControl;
    }
}
}
命名空间脚本控件
{
公共部分类脚本项
{
public FollowupEvent ActiveEvent{get;set;}
公共事件处理程序应答器已更改;
#区域构造函数
公共脚本项()
{
}
公共脚本项(数据行)
{
}
公共脚本项(XElement xelem、FollowupEvent activeEvent、int instanceID)
{
ActiveEvent=ActiveEvent;
InstanceID=InstanceID;
尝试
{
Question=xelem.Elements(“Text”).First().Value.ToString();
AnswerType=xelem.Elements(“Type”).First().Value.ToString();
ControlType=xelem.Elements(“Control”).First().Attribute(“Type”).Value.ToString();
ActivityID=Convert.ToInt32(xelem.Attribute(“ID”).Value.ToString());
ScriptItemType=xelem.Elements(“ScriptItemType”).First().Value.ToString();
ScriptItemQuestionType=xelem.Elements(“QuestionType”).First().Value.ToString();
InputControl=ConfigureInputControl(xelem.Elements(“Control”).First().Attribute(“Type”).Value.ToString());
QuestionControl=ConfigureQuestionControl(xelem.Elements(“Control”).First().Attribute(“Type”).Value.ToString());
Prompt=xelem.Elements(“Prompt”).First().Value.ToString();
}
捕获{}
}
#端区
#区域公共财产
公共字符串提示符{get;set;}
公共面板问题面板=新面板();
public int ActivityID{get;set;}
公共字符串问题{get;set;}
公共字符串应答类型{get;set;}
公共对象结果{get;set;}
公共控件InputControl{get;set;}
公共字符串控制类型{get;set;}
公共控制问题控制{get;set;}
公共字符串ScriptItemType{get;set;}
公共字符串ScriptItemQuestionType{get;set;}
public int InstanceID{get;set;}
公共ScriptControl.Entities.ScriptControlBase ScriptBaseControl{get;set;}
#端区
公共控件配置InputControl(字符串控件类型)
{
开关(控制型)
{
案例“复选框”:
InputControl=新复选框();
打破
案例“布尔问题”:
InputControl=新布尔问题();
((布尔问题)InputControl).AnswerChanged+=ScriptItem_AnswerChanged;
((布尔问题)输入控制)。设置问题(问题);
打破
案例“文本框”:
InputControl=新文本框();
((文本框)InputControl).KeyDown+=ScriptItem_AnswerChanged;
打破
案例“单选按钮”:
InputControl=新单选按钮();
打破
案例“下拉列表”:
InputControl=新单选按钮();
打破
案例“DateTimePicker”:
InputControl=new DateTimePicker();
((DateTimePicker)InputControl).KeyDown+=ScriptItem_AnswerChanged;
打破
案例“.CustomControls.SmartParts.CauseForRepair”:
案例“.CustomControls.SmartParts.Airlines”:
案例“.CustomControls.SmartParts.DREntry”:
InputControl=GetUIControl();
((FN_ControlBase)InputControl).PropertyChanged+=ScriptItem_AnswerChanged;
打破
}
返回输入控制;
}
private void ScriptItem_AnswerChanged(对象发送方,事件参数e)
{
Dictionary workFlowParams=新字典();
开关(控制型)
{
案例“布尔问题”:
控件x=((控件)发送方).Parent.Parent.Parent;
结果=((布尔问题)x);
workFlowParams.Add(“问题ID”,活动);
workFlowParams.Add(“InstanceID”,InstanceID);
workFlowParams.Add(“结果”,结果);
打破
案例“文本框”:
if(((KeyEventArgs)e).KeyValue==13)
{
结果=((文本框)发送者).Text;
workFlowParams.Add(“问题ID”,活动);
workFlowParams.Add(“InstanceID”,InstanceID);
workFlowParams.Add(“结果”,结果);
}
打破
案例“DateTimePicker”:
if(((KeyEventArgs)e).KeyValue==13)
{
结果=((日期时间选择器)发送者).Text;
workFlowParams.Add(“问题ID”,活动);
workFlowParams.Add(“InstanceID”,InstanceID);
workFlowParams.Add(“结果”,结果);
}
((controlName)x).Name = "Awesome";