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

Archer_Smith 2012-08-30 09:09:35
在以下代码中

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();
}
封装成一个函数,应该怎么写?
...全文
1065 15 打赏 收藏 转发到动态 举报
AI 作业
写回复
用AI写文章
15 条回复
切换为时间正序
请发表友善的回复…
发表回复
cheng2005 2012-08-30
  • 打赏
  • 举报
回复
[Quote=引用 14 楼 的回复:]
wddw1986老大,如果已经约束Form了
那是不是和private void ReAct(Form form)一样了呢?
[/Quote]
public Form()
如果是private void ReAct(Form form)
那么你调用的就是Form这个类的Form()构造方法,而不是你真实想要构造的子类对象。
SocketUpEx 2012-08-30
  • 打赏
  • 举报
回复
wddw1986老大,如果已经约束Form了
那是不是和private void ReAct(Form form)一样了呢?


Castiel丶Luo 2012-08-30
  • 打赏
  • 举报
回复
顶楼上..
传肯定可以传 传object 就可以
但是 方法里执行的内容 就需商榷了
cheng2005 2012-08-30
  • 打赏
  • 举报
回复
        private void ReAct<T>(T form) where T : Form, new()
{
if (form == null)
{
form = new T();//将主窗体对象传递过去
form.Show();
}
else
{
form.Activate();
}
}
ViewStates 2012-08-30
  • 打赏
  • 举报
回复
你的代码中已经明确指明了形参有两个方法(SHOW ACTIVATE)并且可以实例化,那么相应的你需要的方法也需要有这种约束。并不能将所有所谓的CLASS传入。
SocketUpEx 2012-08-30
  • 打赏
  • 举报
回复
[Quote=引用 8 楼 的回复:]
我的意思是form可以是任意一个类,比如class1,或是class2
[/Quote]
这个是比较危险的
首先,你不能保证所有传进去的类都有Show和Activate方法
甚至,你不能保证能new
最后,new时需要知道类名
所以,需要使用泛型约束
还不知道能不能约束得了


Archer_Smith 2012-08-30
  • 打赏
  • 举报
回复
我这样说吧,我写了下面的代码

private void ReAct(Form form)
{
if (form == null)
{
form = new Form();//将主窗体对象传递过去
form.Show();
}
else
{
form.Activate();
}
}
但这个函数没有达到我的要求,我的意思是form可以是任意一个类,比如class1,或是class2,因为很多地方要用到这段代码,我不想重复,就想把这部分封装成一个函数。但那个form只是Form这个类,我知道这跟我的参数传递方式有关,我这种写法不对,要怎么写才能达到那种效果呢。我不知道这次表述清楚没有。。。。上面的表达确实有点问题。。
杰拉尔 2012-08-30
  • 打赏
  • 举报
回复
private void Foo(RemindSet rs) 这样就行了吧。如果是三层的话还要增加程序集的引用。
ViewStates 2012-08-30
  • 打赏
  • 举报
回复

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();
}
hfdsoft 2012-08-30
  • 打赏
  • 举报
回复

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();
}
}
SocketUpEx 2012-08-30
  • 打赏
  • 举报
回复
楼主的标题+内容有这么难理解吗?
还是我想得太简单了?


仙剑 2012-08-30
  • 打赏
  • 举报
回复
没有看懂
种草德鲁伊 2012-08-30
  • 打赏
  • 举报
回复
标题的问题:可以,用类型参数<T>或者System.Type
再看帖子的正文,跟标题完全不是一回事
SocketUpEx 2012-08-30
  • 打赏
  • 举报
回复
private void Foo(RemindSet rs)
{
if (RS == null)
{
RS = new RemindSet();//将主窗体对象传递过去
RS.Show();
}
else
{
RS.Activate();
}
}

111,093

社区成员

发帖
与我相关
我的任务
社区描述
.NET技术 C#
社区管理员
  • C#
  • AIGC Browser
  • by_封爱
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告

让您成为最强悍的C#开发者

试试用AI创作助手写篇文章吧