前两天我在看人家的代码时,发现了一个获取远程服务的代码,不知道他是怎么实现的。
如: IUserService UserService = (IUserService)ServiceFactory.getService(); 
我想问的就是一般我们的写法就是: IUserService UserService = (IUserService)ServiceFactory.getService("ServiceName"); 他这里没有写获取的名称,只用了一个强制转换。我想问的就是,他这个getService方法怎么知道应该实例化哪个类(服务)出来,我想应该是根据这个强制转换获取出来的,但是在里面的方法getService能获取到要转换的类型吗?
如果能,怎么获取,谢谢了。

解决方案 »

  1.   

    怎么看不出来,我就是想问 (IUserService)ServiceFactory.getService(); 在getService方法里,有没有方法获取到外面强制转换的 Type 值,也就是在这个方法里就知道返回值是 IUserService
      

  2.   

    典型的反射。IUserService UserService = (IUserService)ServiceFactory.getService("ServiceName"); IUserService是接口。
    ServiceName应该是一个类名,这个类实现上面的接口。
    getService是反射的方法,估计里面的代码就是:
    Assembly ab = Assembly.Load(className);
    ................................这段代码的意思就是根据类名,动态创造实现了IUserService的类的实例。
      

  3.   

    上面的没有读懂楼主的意思,他问的是这句
    (IUserService)ServiceFactory.getService(); 没有传递类名的字符串,如何获得的正确的对象?难道是通过外面的类型转换得知的应该生成哪个类对象?这是不可能的。
      

  4.   

    ServiceFactory.getService();
    有不带参数的么?他是不是重写过了?
      

  5.   

    ServiceFactory.getService()
    把这个方法里的代码是贴出来
      

  6.   

    用的工厂模式.
    ServiceFactory.getService();不带参数,那肯定是因为getService()是他自己写的一个不带参数的方法。
      

  7.   

    ServiceFactory看见红色的字没有!!人家已经很清楚的告诉你,这是一个工厂类。有关工厂类你自己看看设计模式方面的资料
    简单的说,标准工厂类是利用父类,子类的继承和转换关系,做的一种技巧性代码,通常不涉及反射
    不过有些人也会在里面用反射手法。
      

  8.   

    Design Pattern: factory. http://www.dofactory.com/Patterns/PatternAbstract.aspx不是反射。 如果其他地方用了反射,源代码里面应该有对反射到引用。
      

  9.   

    刚才链接贴错了,那个是Abstract Factory, 这个是Factory的:http://www.dofactory.com/Patterns/PatternFactory.aspx
      

  10.   

    关键是我看不到GetService里的代码。
    比如说:现在有10个服务类,也有10个它的接口。
    现在我要实例化哪个服务出来,只需要这样写
     IUserService UserService = (IUserService)ServiceFactory.getService(); 底层就能自动实例化出这个来。
    我想由于我没有传要被实例化的Type,或者Key,它方法里面怎么知道我要实例化的对象?难道是在前面用了 强制转换,在后面方法里就能知道 这个强制转换的类型?
    比如说我要实例化其它服务,也一样的是用的 (ILoginService)ServiceFactory.getService(),这样就能把登录服务实例化出来。 
    所以我才问会,在方法里面,能不能获取到强制转换的类型(Type)
      

  11.   

    在方法里是肯定不能取到强制转换的类型,因为在方法执行的时候还没有执行到强制转换,在方法执行完之后才进行的强制转换
    显式强制转换调用转换运算符,从一种类型转换为另一种类型。如果未定义相应的转换运算符,则强制转换会失败。
    同时显示强制转换包括所有隐式转换,即任何系统允许的隐式转换写成显示转换的形式都是允许的。
    隐式转换包括以下转换(可能不全):
        从任何引用类型到object的转换。
        从类类型A到类类型B的转换,其中类A从类B派生得到。
        从类类型A到接口类型B的转换,其中类A实现了接口B。
        从接口类型A到接口类型B的转换,其中接口A是从接口B派生。
        从任何数组类型到System.Array的转换。
        从任何委托类型到System.Delegate的转换。
        从任何数组类型或委托类型到System.ICloneable的转换。
        从空类型(null)到任何引用类型的转换。