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";