当前位置:编程学习 > C#/ASP.NET >>

字符串转换成泛型方法问题,搞死了

 
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()
{

}
泛型 --------------------编程问答-------------------- http://msdn.microsoft.com/zh-cn/library/system.type.makegenerictype.aspx --------------------编程问答-------------------- 反射方式加载就可以了 --------------------编程问答-------------------- google C# 反射 --------------------编程问答-------------------- 反射不了,搞了一下午了 --------------------编程问答-------------------- 反射可以,1L正解。搞不了说明你笨。 --------------------编程问答-------------------- 什么乱七八糟的“范型”概念?

你以为 ShowForm<Form1>() 这里的T是写对象实例啊?!晕。 --------------------编程问答-------------------- 很遗憾,你完全没有理解范型是什么东西。这也就可想而知你对“反射”的学习进度为什么会是完全无法入门了。所以还是要找个方法学进去点知识才行。

就你问题而言,我认为不论是范型还是反射,我都不认为有什么必要。你的 ShowForm<Form1>() 谁只要要显示什么?难道定义为
public void ShowForm(Form f)
{
   
}
就不行吗?

编程当然是要越简单越好,能少用class、少用方法、少写代码,当然越少越好。如果要写就要懂得需求驱动,等你有了那么大的需求时才应该使用高级的设计。不要为了范型而范型。为了炫技往往把自己搞死,弄出来诡异和累赘的东西。 --------------------编程问答-------------------- 泛型是用在编码时类型确定的场合,你这种编码时不确定类型,只能用字符串来动态表示的场合,不适合用泛型,虽然可以实现(见1楼提供的帮助),但是效率不及使用普通方法来的高。 --------------------编程问答--------------------
引用 7 楼 sp1234 的回复:
很遗憾,你完全没有理解范型是什么东西。这也就可想而知你对“反射”的学习进度为什么会是完全无法入门了。所以还是要找个方法学进去点知识才行。

就你问题而言,我认为不论是范型还是反射,我都不认为有什么必要。你的 ShowForm<Form1>() 谁只要要显示什么?难道定义为C# code?1234public void ShowForm(Form f){    }就不行……


主要是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;
        }


    }

--------------------编程问答--------------------
引用 5 楼 caozhy 的回复:
反射可以,1L正解。搞不了说明你笨。


请赐教。小弟.net水平确实一般,且两年多没写程序了,转行干建筑行业了最近搞一个自用的管理软件,才重拾VS的 --------------------编程问答--------------------
引用 6 楼 sp1234 的回复:
什么乱七八糟的“范型”概念?

你以为 ShowForm<Form1>() 这里的T是写对象实例啊?!晕。


T不是实例啊,是类型,泛型泛型泛类型
补充:.NET技术 ,  C#
CopyRight © 2012 站长网 编程知识问答 www.zzzyk.com All Rights Reserved
部份技术文章来自网络,