C#静态方法如何间接访问实例成员变量

arno-1104 2017-07-11 01:36:39
Display类是个窗体类,里面有个PictureBox控件,在这个类里面希望实现一个静态的函数来调用PictureBox控件以方便修改显示的图片,同时可以使用其他的类来调用这个静态函数修改图片,但是在希望实现的静态函数中不能PictureBox控件
...全文
739 25 打赏 收藏 转发到动态 举报
写回复
用AI写文章
25 条回复
切换为时间正序
请发表友善的回复…
发表回复
arno-1104 2017-07-11
  • 打赏
  • 举报
回复
说道最后好像已经跑题了,但还是要有个结论,我目前采用的方法是在主窗体创建两个子窗体,创建的时候把主窗体的this指针传到各个子窗体保存,在子窗体load的时候调用主窗体的的函数将各自子窗体的this指针传回主窗体,这样两个子窗体要传递信息的时候直接向主窗体询问另一个窗体的this指针,这样就把数据传过去了,虽然麻烦但是确实有效果。
正怒月神 2017-07-11
  • 打赏
  • 举报
回复
我只是觉得如果只传控件类型的做法是有漏洞的,pictureBox类型的控件就无所谓了,但是将来出现两个甚至更多就没法区分了,难不成我还在再增加个传递参数,然后再解析,显然代码冗余不精练 如果你以后会出现多种控件传递,那就应该使用工厂模式来弄。 分成几个Class来写各种控件的处理方式。 调用者通过createfactory来实例化各个控件的实现逻辑。
wanghui0380 2017-07-11
  • 打赏
  • 举报
回复
我们是依赖倒置, 比如你这个,如果是按你的思维,net的写法会是, public static xxx(string url, Action<Image> action) { image imge=image.fromfile(url); action(imge);//回调给外面,外面的自己知道自己用什么,你这里其实并不知道外面是什么东西,就像你说的你既不知道类名,也不知道name名,甚至你都不确定他是不是picturebox,反正你只知道他要加载一个image而已,所以既然啥都不知道,他就回调出去,外面的人自己知道自己在干啥 } 外面调用者 xxx("图片地址",c=>{ 我作为调用者我当然知道自己的实例是什么.当然知道我现在有个控件类型是picturebox.我当然知道pictrue有个属性叫image=c; });
arno-1104 2017-07-11
  • 打赏
  • 举报
回复
引用 21 楼 wanghui0380 的回复:
[quote=引用 18 楼 spu20134823091 的回复:] [quote=引用 16 楼 wanghui0380 的回复:] 为啥你一定要什么 在方法内部使用什么“类名+控件name”来方法,你知道类名是什么不,你知道控件name是什么不 很明显如果是多个地方调用,你根本就不知道,你既然不知道,还怎么写??难道要写N个if else 所以你无需管什么类名,什么name,你只需要管picturebox,他给你传什么picturebox就是什么picturebox。(当然如果你愿意也可以让外面通用继承一个专用接口,不过这就折腾了)
我只是觉得如果只传控件类型的做法是有漏洞的,pictureBox类型的控件就无所谓了,但是将来出现两个甚至更多就没法区分了,难不成我还在再增加个传递参数,然后再解析,显然代码冗余不精练。[/quote] 额,我们C#滴不这么想问题,如果要通用对外我们只传stream,怎么使用stream是外面的事情,他想怎么用就怎么用,我们不干涉?如果你一定要干涉,那就委托出去(这个相当与你们C
引用 21 楼 wanghui0380 的回复:
[quote=引用 18 楼 spu20134823091 的回复:] [quote=引用 16 楼 wanghui0380 的回复:] 为啥你一定要什么 在方法内部使用什么“类名+控件name”来方法,你知道类名是什么不,你知道控件name是什么不 很明显如果是多个地方调用,你根本就不知道,你既然不知道,还怎么写??难道要写N个if else 所以你无需管什么类名,什么name,你只需要管picturebox,他给你传什么picturebox就是什么picturebox。(当然如果你愿意也可以让外面通用继承一个专用接口,不过这就折腾了)
我只是觉得如果只传控件类型的做法是有漏洞的,pictureBox类型的控件就无所谓了,但是将来出现两个甚至更多就没法区分了,难不成我还在再增加个传递参数,然后再解析,显然代码冗余不精练。[/quote] 额,我们C#滴不这么想问题,如果要通用对外我们只传stream,怎么使用stream是外面的事情,他想怎么用就怎么用,我们不干涉?如果你一定要干涉,那就委托出去(这个相当与你们C++的回调,他想怎么用他自己在回调里处理)[/quote]好吧,之前还以为C#和C++差不多,还是不一样。
wanghui0380 2017-07-11
  • 打赏
  • 举报
回复
引用 18 楼 spu20134823091 的回复:
[quote=引用 16 楼 wanghui0380 的回复:] 为啥你一定要什么 在方法内部使用什么“类名+控件name”来方法,你知道类名是什么不,你知道控件name是什么不 很明显如果是多个地方调用,你根本就不知道,你既然不知道,还怎么写??难道要写N个if else 所以你无需管什么类名,什么name,你只需要管picturebox,他给你传什么picturebox就是什么picturebox。(当然如果你愿意也可以让外面通用继承一个专用接口,不过这就折腾了)
我只是觉得如果只传控件类型的做法是有漏洞的,pictureBox类型的控件就无所谓了,但是将来出现两个甚至更多就没法区分了,难不成我还在再增加个传递参数,然后再解析,显然代码冗余不精练。[/quote] 额,我们C#滴不这么想问题,如果要通用对外我们只传stream,怎么使用stream是外面的事情,他想怎么用就怎么用,我们不干涉?如果你一定要干涉,那就委托出去(这个相当与你们C++的回调,他想怎么用他自己在回调里处理)
arno-1104 2017-07-11
  • 打赏
  • 举报
回复
引用 17 楼 starfd 的回复:
Form只要被关掉了,就调用Dispose方法释放了,所以你想要在非当前form执行获取控件,那么可以将这个控件public出来,然后你的问题就转成了怎么获取form,这个肯定能够通过某种方法来获取的,如果彼此有关系,那直接就可以通过关系获取,如果彼此没关系,那估计需要通过最外层的mainform来间接进行获取
这是问题的关键,貌似目前只有这个办法了。
wanghui0380 2017-07-11
  • 打赏
  • 举报
回复
如果你就是不待见让调用者写个参数,那么好吧。写扩展方法,让调用者省掉一个方法参数 public static class pictruboxEx { public void static LoadFromPath(this picturebox pic,string path) { //你自己的代码 } } 调用方在外面只需要 XXXpicturebox.LoadFromPath("xxxx"); //调用者自己知道他要给什么东西赋值,并不需要你去在内部搞什么“xxx.yyy”访问
arno-1104 2017-07-11
  • 打赏
  • 举报
回复
引用 16 楼 wanghui0380 的回复:
为啥你一定要什么 在方法内部使用什么“类名+控件name”来方法,你知道类名是什么不,你知道控件name是什么不 很明显如果是多个地方调用,你根本就不知道,你既然不知道,还怎么写??难道要写N个if else 所以你无需管什么类名,什么name,你只需要管picturebox,他给你传什么picturebox就是什么picturebox。(当然如果你愿意也可以让外面通用继承一个专用接口,不过这就折腾了)
我只是觉得如果只传控件类型的做法是有漏洞的,pictureBox类型的控件就无所谓了,但是将来出现两个甚至更多就没法区分了,难不成我还在再增加个传递参数,然后再解析,显然代码冗余不精练。
  • 打赏
  • 举报
回复
Form只要被关掉了,就调用Dispose方法释放了,所以你想要在非当前form执行获取控件,那么可以将这个控件public出来,然后你的问题就转成了怎么获取form,这个肯定能够通过某种方法来获取的,如果彼此有关系,那直接就可以通过关系获取,如果彼此没关系,那估计需要通过最外层的mainform来间接进行获取
wanghui0380 2017-07-11
  • 打赏
  • 举报
回复
为啥你一定要什么 在方法内部使用什么“类名+控件name”来方法,你知道类名是什么不,你知道控件name是什么不 很明显如果是多个地方调用,你根本就不知道,你既然不知道,还怎么写??难道要写N个if else 所以你无需管什么类名,什么name,你只需要管picturebox,他给你传什么picturebox就是什么picturebox。(当然如果你愿意也可以让外面通用继承一个专用接口,不过这就折腾了)
arno-1104 2017-07-11
  • 打赏
  • 举报
回复
引用 14 楼 starfd 的回复:
感觉我们的描述就不在一条线上 在winform里面,UI主线程之外的线程要更新控件,必须通过Invoke的方式 还有通过内存获取已存在的控件,上面让你将控件作为参数传递,就是传递的引用类型,相当于C++的指针
但是在另一个类里面访问不到这个要修改的控件,也就没法将这个控件作为参数,没法使用类名+控件name的方式访问,如果new一个新的实例使用实例名+控件name访问,访问的就不是之前存在控件,另外我没有创建新的线程,应该不存在Invoke的访问方式。
  • 打赏
  • 举报
回复
感觉我们的描述就不在一条线上 在winform里面,UI主线程之外的线程要更新控件,必须通过Invoke的方式 还有通过内存获取已存在的控件,上面让你将控件作为参数传递,就是传递的引用类型,相当于C++的指针
arno-1104 2017-07-11
  • 打赏
  • 举报
回复
引用 12 楼 wanghui0380 的回复:
方法1.直接把pic当方法参数专递过来 方法2:对pic类编写扩展方法 ------------------- ps:其实总体上看这种封装是多余的,加载图片并赋值pic并不是什么多么难的事情,而且你这代码封装的跟没封也没啥区别。嘿嘿你这代码在实际运行中会有各种各样的“偶发性”异常,什么gdi+一般性错误,什么内存溢出,什么权限不足,等等。
大神先让我膜拜一下,之所以这样封装是因为静态的函数可以用类型+方法访问到,而控件在别的类总中访问不到,今天实践了一下这样做不是曲线救国的思路,所以我想访问内存中已经存在、不需要在重新实例化的控件应如何做,有没有类似指针的操作,直接拿到内存中窗口的句柄,直接进行操作,我之前用的C++,思路可能没有装换过来。
wanghui0380 2017-07-11
  • 打赏
  • 举报
回复
方法1.直接把pic当方法参数专递过来 方法2:对pic类编写扩展方法 ------------------- ps:其实总体上看这种封装是多余的,加载图片并赋值pic并不是什么多么难的事情,而且你这代码封装的跟没封也没啥区别。嘿嘿你这代码在实际运行中会有各种各样的“偶发性”异常,什么gdi+一般性错误,什么内存溢出,什么权限不足,等等。
arno-1104 2017-07-11
  • 打赏
  • 举报
回复
引用 6 楼 starfd 的回复:
作为静态方法来说,你传递进来是什么控件,它就对什么控件进行修改,何来多个实例会混乱?
static void ControlChange(Control control,string txt)
{
if(control is TextBox) ((TextBox)control).Value=txt;
}
这样怎么可能混淆?
10楼回复
arno-1104 2017-07-11
  • 打赏
  • 举报
回复
这样做方法是可以访问到了,但是空间依然只能使用创建新实例的方法来访问,还是会报错
秋的红果实 2017-07-11
  • 打赏
  • 举报
回复
我猜想,你是为了方便, 为什么不另外设计一个类,把静态方法放进去,运行时传递参数给这个静态方法
arno-1104 2017-07-11
  • 打赏
  • 举报
回复
引用 7 楼 duanzi_peng 的回复:
[quote=引用 5 楼 spu20134823091 的回复:] [quote=引用 2 楼 duanzi_peng 的回复:] 不过你可以把调用类改成 单例模式 也就是类初始化一次,类似: 调用:
Singleton.Instance.Setxxx();
这样代码修改的量就比较大了[/quote] Ctrl+F 替换,选择整个项目,分分种种的事。[/quote]前提是我一个人负责整个项目,或者说服我旁边的全部工程师
exception92 2017-07-11
  • 打赏
  • 举报
回复
引用 5 楼 spu20134823091 的回复:
[quote=引用 2 楼 duanzi_peng 的回复:] 不过你可以把调用类改成 单例模式 也就是类初始化一次,类似: 调用:
Singleton.Instance.Setxxx();
这样代码修改的量就比较大了[/quote] Ctrl+F 替换,选择整个项目,分分种种的事。
  • 打赏
  • 举报
回复
作为静态方法来说,你传递进来是什么控件,它就对什么控件进行修改,何来多个实例会混乱?
static void ControlChange(Control control,string txt)
{
if(control is TextBox) ((TextBox)control).Value=txt;
}
这样怎么可能混淆?
加载更多回复(5)

110,500

社区成员

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

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

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