字符串转换成泛型方法问题,搞死了
泛型 --------------------编程问答-------------------- http://msdn.microsoft.com/zh-cn/library/system.type.makegenerictype.aspx --------------------编程问答-------------------- 反射方式加载就可以了 --------------------编程问答-------------------- google C# 反射 --------------------编程问答-------------------- 反射不了,搞了一下午了 --------------------编程问答-------------------- 反射可以,1L正解。搞不了说明你笨。 --------------------编程问答-------------------- 什么乱七八糟的“范型”概念?
public partial class Form1 : BaseForm ...
public partial class Form2 : BaseForm ...
// 根据formString 参数显示对应的窗体
switch(formString)
{
case "Form1":
ShowForm<Form1>();
break;
case "Form2":
ShowForm<Form2>();
break;
}
如果有100个窗体,那就歇菜了,有没有类似 Eval("ShowForm<"+formString+">()") 的方法直接执行?
/// <summary>
/// 显示窗体
/// </summary>
/// <typeparam name="T"></typeparam>
public void ShowForm<T>()where T : BaseForm, new()
{
}
你以为 ShowForm<Form1>() 这里的T是写对象实例啊?!晕。 --------------------编程问答-------------------- 很遗憾,你完全没有理解范型是什么东西。这也就可想而知你对“反射”的学习进度为什么会是完全无法入门了。所以还是要找个方法学进去点知识才行。
就你问题而言,我认为不论是范型还是反射,我都不认为有什么必要。你的 ShowForm<Form1>() 谁只要要显示什么?难道定义为
public void ShowForm(Form f)就不行吗?
{
}
编程当然是要越简单越好,能少用class、少用方法、少写代码,当然越少越好。如果要写就要懂得需求驱动,等你有了那么大的需求时才应该使用高级的设计。不要为了范型而范型。为了炫技往往把自己搞死,弄出来诡异和累赘的东西。 --------------------编程问答-------------------- 泛型是用在编码时类型确定的场合,你这种编码时不确定类型,只能用字符串来动态表示的场合,不适合用泛型,虽然可以实现(见1楼提供的帮助),但是效率不及使用普通方法来的高。 --------------------编程问答--------------------
主要是ShowForm方法里实例单件用到了泛型,所以不得已
/// <summary>--------------------编程问答--------------------
/// 显示窗体,并置于最前端
/// </summary>
/// <typeparam name="T"></typeparam>
public void ShowForm<T>()where T : BaseForm, new()
{
if (this.ActiveMdiChild != null)
{
if (this.ActiveMdiChild is T) return;
else this.ActiveMdiChild.Close(); //关闭之前的窗体
}
if (this.LastMDIFormClosed)
{
T f = Singleton<T>.Instance;
f.MdiParent = this;
f.Text = f.String_Subject;
f.WindowState = FormWindowState.Maximized;
f.Show();
f.BringToFront();
}
}
/// <summary>
/// 泛型实现窗体实例单件化
/// </summary>
/// <typeparam name="T">窗体类</typeparam>
public static class Singleton<T> where T : BaseForm, new()
{
private static T m_Instance = null;
private static readonly object lockHelper = new object();
/// <summary>
/// 获取窗体的唯一实例
/// </summary>
public static T Instance
{
get
{
if (m_Instance == null)
{
lock (lockHelper)
{
if (m_Instance == null)
{
m_Instance = new T();
m_Instance.FormClosing += new FormClosingEventHandler(FormClosing);
m_Instance.FormClosed += new FormClosedEventHandler(FormClosed);
}
}
}
return m_Instance;
}
}
/// <summary>
/// 当窗体准备关闭之前发生
/// </summary>
/// <param name="sender"></param>
/// <param name="e"></param>
static void FormClosing(object sender, FormClosingEventArgs e)
{
m_Instance.OwnerForm.LastMDIFormClosed = false;
if (m_Instance.Modified)
{
switch (MessageBox.Show(m_Instance.String_SavingQuery, "保存提示", MessageBoxButtons.YesNoCancel, MessageBoxIcon.Question, MessageBoxDefaultButton.Button1))
{
case DialogResult.Yes:
m_Instance.Save();
break;
case DialogResult.No:
break;
case DialogResult.Cancel:
e.Cancel = true;
break;
}
}
}
/// <summary>
/// 当窗体关闭时将Instance置空
/// </summary>
/// <param name="sender"></param>
/// <param name="e"></param>
private static void FormClosed(object sender, FormClosedEventArgs e)
{
m_Instance.OwnerForm.LastMDIFormClosed = true;
m_Instance = null;
}
}
请赐教。小弟.net水平确实一般,且两年多没写程序了,转行干建筑行业了最近搞一个自用的管理软件,才重拾VS的 --------------------编程问答--------------------
T不是实例啊,是类型,泛型泛型泛类型
补充:.NET技术 , C#