请问C#中类可以作为参数传递吗?

时间:2022-08-29 20:49:33
在以下代码中

        public static RemindSet RS;
        private void btnRemindSet_Click(object sender, EventArgs e)
        {
            if (RS == null)
            {
                RS = new RemindSet();//将主窗体对象传递过去
                RS.Show();
            }
            else
            {
                RS.Activate();
            }
            
        }


            if (RS == null)
            {
                RS = new RemindSet();//将主窗体对象传递过去
                RS.Show();
            }
            else
            {
                RS.Activate();
            }
    
封装成一个函数,应该怎么写?

15 个解决方案

#1


        private void Foo(RemindSet rs)
        {
            if (RS == null)
            {
                RS = new RemindSet();//将主窗体对象传递过去
                RS.Show();
            }
            else
            {
                RS.Activate();
            }
        }

#2


标题的问题:可以,用类型参数<T>或者System.Type
再看帖子的正文,跟标题完全不是一回事

#3


没有看懂

#4


楼主的标题+内容有这么难理解吗?
还是我想得太简单了?

请问C#中类可以作为参数传递吗?

#5



        public static RemindSet RS;
        private void btnRemindSet_Click(object sender, EventArgs e)
        {
            ShowRemindSet(RS);
        }
        private void ShowRemindSet(RemindSet RS){
            if(RS==null)
            {
                RS = new RemindSet();
                RS.Show();
            }
            else
            {
                RS.Activate();
            }
    }

#6



class Template<T> where T:IRemindSet
{
  public static void Foo(T t)
  { 
    if (t== null)
  {
  t=RemindSetFactory.Create(typeof(T));//将主窗体对象传递过去
  t.Show();
  }
  else
  {
  t.Activate();
  }
  }
}

interface IRemindSet
{
  void Show();
  void Active();
}

#7


private void Foo(RemindSet rs) 这样就行了吧。如果是三层的话还要增加程序集的引用。

#8


我这样说吧,我写了下面的代码

 private void ReAct(Form form)
        {
            if (form == null)
            {
                form = new Form();//将主窗体对象传递过去
                form.Show();
            }
            else
            {
                form.Activate();
            }
        }
但这个函数没有达到我的要求,我的意思是form可以是任意一个类,比如class1,或是class2,因为很多地方要用到这段代码,我不想重复,就想把这部分封装成一个函数。但那个form只是Form这个类,我知道这跟我的参数传递方式有关,我这种写法不对,要怎么写才能达到那种效果呢。我不知道这次表述清楚没有。。。。上面的表达确实有点问题。。

#10


引用 8 楼  的回复:
我的意思是form可以是任意一个类,比如class1,或是class2

这个是比较危险的
首先,你不能保证所有传进去的类都有Show和Activate方法
甚至,你不能保证能new
最后,new时需要知道类名
所以,需要使用泛型约束
还不知道能不能约束得了

请问C#中类可以作为参数传递吗?

#11


你的代码中已经明确指明了形参有两个方法(SHOW ACTIVATE)并且可以实例化,那么相应的你需要的方法也需要有这种约束。并不能将所有所谓的CLASS传入。

#12


        private void ReAct<T>(T form) where T : Form, new()
        {
            if (form == null)
            {
                form = new T();//将主窗体对象传递过去
                form.Show();
            }
            else
            {
                form.Activate();
            }
        }

#13


顶楼上..
传肯定可以传 传object 就可以
但是 方法里执行的内容 就需商榷了

#14


wddw1986老大,如果已经约束Form了
那是不是和private void ReAct(Form form)一样了呢?

请问C#中类可以作为参数传递吗?

#15


引用 14 楼  的回复:
wddw1986老大,如果已经约束Form了
那是不是和private void ReAct(Form form)一样了呢?

public Form()
如果是private void ReAct(Form form)
那么你调用的就是Form这个类的Form()构造方法,而不是你真实想要构造的子类对象。

#1


        private void Foo(RemindSet rs)
        {
            if (RS == null)
            {
                RS = new RemindSet();//将主窗体对象传递过去
                RS.Show();
            }
            else
            {
                RS.Activate();
            }
        }

#2


标题的问题:可以,用类型参数<T>或者System.Type
再看帖子的正文,跟标题完全不是一回事

#3


没有看懂

#4


楼主的标题+内容有这么难理解吗?
还是我想得太简单了?

请问C#中类可以作为参数传递吗?

#5



        public static RemindSet RS;
        private void btnRemindSet_Click(object sender, EventArgs e)
        {
            ShowRemindSet(RS);
        }
        private void ShowRemindSet(RemindSet RS){
            if(RS==null)
            {
                RS = new RemindSet();
                RS.Show();
            }
            else
            {
                RS.Activate();
            }
    }

#6



class Template<T> where T:IRemindSet
{
  public static void Foo(T t)
  { 
    if (t== null)
  {
  t=RemindSetFactory.Create(typeof(T));//将主窗体对象传递过去
  t.Show();
  }
  else
  {
  t.Activate();
  }
  }
}

interface IRemindSet
{
  void Show();
  void Active();
}

#7


private void Foo(RemindSet rs) 这样就行了吧。如果是三层的话还要增加程序集的引用。

#8


我这样说吧,我写了下面的代码

 private void ReAct(Form form)
        {
            if (form == null)
            {
                form = new Form();//将主窗体对象传递过去
                form.Show();
            }
            else
            {
                form.Activate();
            }
        }
但这个函数没有达到我的要求,我的意思是form可以是任意一个类,比如class1,或是class2,因为很多地方要用到这段代码,我不想重复,就想把这部分封装成一个函数。但那个form只是Form这个类,我知道这跟我的参数传递方式有关,我这种写法不对,要怎么写才能达到那种效果呢。我不知道这次表述清楚没有。。。。上面的表达确实有点问题。。

#9


#10


引用 8 楼  的回复:
我的意思是form可以是任意一个类,比如class1,或是class2

这个是比较危险的
首先,你不能保证所有传进去的类都有Show和Activate方法
甚至,你不能保证能new
最后,new时需要知道类名
所以,需要使用泛型约束
还不知道能不能约束得了

请问C#中类可以作为参数传递吗?

#11


你的代码中已经明确指明了形参有两个方法(SHOW ACTIVATE)并且可以实例化,那么相应的你需要的方法也需要有这种约束。并不能将所有所谓的CLASS传入。

#12


        private void ReAct<T>(T form) where T : Form, new()
        {
            if (form == null)
            {
                form = new T();//将主窗体对象传递过去
                form.Show();
            }
            else
            {
                form.Activate();
            }
        }

#13


顶楼上..
传肯定可以传 传object 就可以
但是 方法里执行的内容 就需商榷了

#14


wddw1986老大,如果已经约束Form了
那是不是和private void ReAct(Form form)一样了呢?

请问C#中类可以作为参数传递吗?

#15


引用 14 楼  的回复:
wddw1986老大,如果已经约束Form了
那是不是和private void ReAct(Form form)一样了呢?

public Form()
如果是private void ReAct(Form form)
那么你调用的就是Form这个类的Form()构造方法,而不是你真实想要构造的子类对象。