不知道这个问题是不是反射?

qyfjl 2008-10-21 09:45:42
前两天我在看人家的代码时,发现了一个获取远程服务的代码,不知道他是怎么实现的。
如: IUserService UserService = (IUserService)ServiceFactory.getService();
我想问的就是一般我们的写法就是: IUserService UserService = (IUserService)ServiceFactory.getService("ServiceName");

他这里没有写获取的名称,只用了一个强制转换。我想问的就是,他这个getService方法怎么知道应该实例化哪个类(服务)出来,我想应该是根据这个强制转换获取出来的,但是在里面的方法getService能获取到要转换的类型吗?
如果能,怎么获取,谢谢了。
...全文
219 26 打赏 收藏 转发到动态 举报
写回复
用AI写文章
26 条回复
切换为时间正序
请发表友善的回复…
发表回复
qyfjl 2009-04-24
  • 打赏
  • 举报
回复
问了人家,他说用的是透明代理,能在里面知道类型。
结帐了。
slimfeng 2008-10-22
  • 打赏
  • 举报
回复
在方法里是肯定不能取到强制转换的类型,因为在方法执行的时候还没有执行到强制转换,在方法执行完之后才进行的强制转换
显式强制转换调用转换运算符,从一种类型转换为另一种类型。如果未定义相应的转换运算符,则强制转换会失败。
同时显示强制转换包括所有隐式转换,即任何系统允许的隐式转换写成显示转换的形式都是允许的。
隐式转换包括以下转换(可能不全):
    从任何引用类型到object的转换。
    从类类型A到类类型B的转换,其中类A从类B派生得到。
    从类类型A到接口类型B的转换,其中类A实现了接口B。
    从接口类型A到接口类型B的转换,其中接口A是从接口B派生。
    从任何数组类型到System.Array的转换。
    从任何委托类型到System.Delegate的转换。
    从任何数组类型或委托类型到System.ICloneable的转换。
    从空类型(null)到任何引用类型的转换。
LQknife 2008-10-22
  • 打赏
  • 举报
回复
不是
qyfjl 2008-10-22
  • 打赏
  • 举报
回复
关键是我看不到GetService里的代码。
比如说:现在有10个服务类,也有10个它的接口。
现在我要实例化哪个服务出来,只需要这样写
IUserService UserService = (IUserService)ServiceFactory.getService(); 底层就能自动实例化出这个来。
我想由于我没有传要被实例化的Type,或者Key,它方法里面怎么知道我要实例化的对象?难道是在前面用了 强制转换,在后面方法里就能知道 这个强制转换的类型?
比如说我要实例化其它服务,也一样的是用的 (ILoginService)ServiceFactory.getService(),这样就能把登录服务实例化出来。
所以我才问会,在方法里面,能不能获取到强制转换的类型(Type)
qshzf 2008-10-21
  • 打赏
  • 举报
回复
up
wanghui0380 2008-10-21
  • 打赏
  • 举报
回复
ServiceFactory

看见红色的字没有!!

人家已经很清楚的告诉你,这是一个工厂类。

有关工厂类你自己看看设计模式方面的资料


简单的说,标准工厂类是利用父类,子类的继承和转换关系,做的一种技巧性代码,通常不涉及反射
不过有些人也会在里面用反射手法。

冷月孤峰 2008-10-21
  • 打赏
  • 举报
回复
用的工厂模式.
ServiceFactory.getService();不带参数,那肯定是因为getService()是他自己写的一个不带参数的方法。
patrickpan 2008-10-21
  • 打赏
  • 举报
回复
ServiceFactory.getService()
把这个方法里的代码是贴出来
wheeler 2008-10-21
  • 打赏
  • 举报
回复
[Quote=引用 2 楼 qyfjl 的回复:]
怎么看不出来,我就是想问 (IUserService)ServiceFactory.getService(); 在getService方法里,有没有方法获取到外面强制转换的 Type 值,也就是在这个方法里就知道返回值是 IUserService
[/Quote]

不传 也能拿~~

不是神 就是 还有关键代码 你没贴出来
Code従業員 2008-10-21
  • 打赏
  • 举报
回复
ServiceFactory.getService();
有不带参数的么?他是不是重写过了?
warrior 2008-10-21
  • 打赏
  • 举报
回复
上面的没有读懂楼主的意思,他问的是这句
(IUserService)ServiceFactory.getService();

没有传递类名的字符串,如何获得的正确的对象?难道是通过外面的类型转换得知的应该生成哪个类对象?

这是不可能的。
warrior 2008-10-21
  • 打赏
  • 举报
回复
[Quote=引用 2 楼 qyfjl 的回复:]
怎么看不出来,我就是想问 (IUserService)ServiceFactory.getService(); 在getService方法里,有没有方法获取到外面强制转换的 Type 值,也就是在这个方法里就知道返回值是 IUserService
[/Quote]
不可能。
patrickpan 2008-10-21
  • 打赏
  • 举报
回复
典型的反射。

IUserService UserService = (IUserService)ServiceFactory.getService("ServiceName");

IUserService是接口。
ServiceName应该是一个类名,这个类实现上面的接口。
getService是反射的方法,估计里面的代码就是:
Assembly ab = Assembly.Load(className);
................................

这段代码的意思就是根据类名,动态创造实现了IUserService的类的实例。
tian_fang 2008-10-21
  • 打赏
  • 举报
回复

[Quote=引用 1 楼 asdf311 的回复:]
光凭这两句,看不出来
[/Quote]

是的
ericzhangbo1982111 2008-10-21
  • 打赏
  • 举报
回复
这个是工厂模式
qyfjl 2008-10-21
  • 打赏
  • 举报
回复
怎么看不出来,我就是想问 (IUserService)ServiceFactory.getService(); 在getService方法里,有没有方法获取到外面强制转换的 Type 值,也就是在这个方法里就知道返回值是 IUserService
wheeler 2008-10-21
  • 打赏
  • 举报
回复
光凭这两句,看不出来
mmvr 2008-10-21
  • 打赏
  • 举报
回复
刚才链接贴错了,那个是Abstract Factory, 这个是Factory的:http://www.dofactory.com/Patterns/PatternFactory.aspx
mmvr 2008-10-21
  • 打赏
  • 举报
回复
Design Pattern: factory. http://www.dofactory.com/Patterns/PatternAbstract.aspx

不是反射。

如果其他地方用了反射,源代码里面应该有对反射到引用。
lwz1983 2008-10-21
  • 打赏
  • 举报
回复
这个哪里是反射啊
加载更多回复(6)

110,567

社区成员

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

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

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