[英]Instantiating a passed form of unknown type
我的应用程序中有一些表单,这些表单显示绑定到BindingSource的DataGrid。 当我双击一行时,我将显示一个详细信息表单。
这些“浏览”表格中有将近50种及其附带的详细表格。 我想通过创建基本浏览表单并将适当的BindingSource传递给它来减少表单(和代码)的数量。 我有这个工作。 但是,当我双击一行时,我想实例化与传递的BindingSource相关的详细信息表单。
例如,如果用户正在浏览“客户”表,则将打开“客户详细信息”表单,但是如果他正在浏览“作业”表,则将打开“作业详细信息”表单。
我可以将通用详细信息表单作为参数传递,但是如何将传递的表单转换为正确的类型之一,以便实例化呢?
(我试图避免使用大的switch语句循环选择正确的传递形式。当然,有一种更优雅的方法可以实现这一点吗?)
[编辑]我的浏览表单代码被实例化为:
public BaseBrowse(BindingSource dataClass, DevExpress.XtraEditors.XtraForm crudForm)
{
InitializeComponent();
bs = dataClass;
crud = ((CRUDEquipment)(crudForm));
}
因此,我的双击事件是:
private void gvw_DoubleClick(object sender, EventArgs e)
{
Int32 nID = Convert.ToInt32(gvw.GetFocusedRowCellValue("ID"));
((CRUDEquipment)(crud)).intID = nID;
((CRUDEquipment)(crud)).Show();
}
我需要一种用我需要的任何形式替换“ CRUDEquipment”的方法。
也许其中之一会有所帮助
public void Instantiate<T>()
{
var myObject = Activator.CreateInstance<T>();
// Do something with myObject
}
public void Instantiate(Type t)
{
var myObject = Activator.CreateInstance(t);
// Do something with myObject
}
public void Instantiate(string typeName)
{
var detailType = Type.GetType(typeName);
if (detailType == null)
{
throw new InvalidOperationException("Nice try, but type {0} doesn't compute :)");
}
var myObject = Activator.CreateInstance(detailType);
// Do something with myObject
}
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.