我想在父方法中访问外部类(Web服务)的方法(Web服务在子类中实例化)
场景是这样的: 我有一个名为ConvertCurrency的母类,它接收美元并给出卢比。 例如。 int ConvertCurrency(int dollars);
现在市场上有一个标准供应商,提供任何人都可以在他的服务器上托管并创建网络服务的软件。所以,我们可以说它托管在两个地方:www.link-A.com/service.asmx和www.link-B.com/service.asmx。
我有一个父类:CurrencyConvertor,它有两个子类:Convertor-A和Convertor-B。
Class CurrencyConvertor
{
protected Object Service;
public Convert(int dollars)
{
Service.ConvertCurrency(dollars);
}
}
Class Convertor-A : CurrencyConvertor
{
public Convertor-A()
{
Service = link-A.service;
}
}
Class Convertor-B : CurrencyConvertor
{
public Convertor-B()
{
Service = link-B.service;
}
}
// based on current response-time of the two servers, we decide
// that B is faster and hence we make the decision at run-time that we should use
// B's service
CurrencyConvertor cc = new Convertor-B();
cc.Convert(5);
但是这不会编译,因为父类不知道Service所有的方法是什么,它会产生以下错误:
'对象'不包含' GetSources'的定义没有扩展方法' GetSources'接受类型'对象'的第一个参数。可以找到(你错过了使用指令或程序集引用吗?)
我想知道这个问题的可能解决方案是什么。当然,无需为两个提供者中的每一个创建单独的转换函数。
如果我能以某种方式做出服务"对象知道它的接口(即函数签名),它将正常工作。
有没有办法解决这个问题?
答案 0 :(得分:0)
在CurrencyConvertor中创建一个名为GetService()的抽象方法; 派生类必须以返回服务的方式实现此方法......
CurrencyConverter中的:
public abstract IMyNewServiceThingy GetService();
基类现在可以使用此类来获取服务并在其上调用方法
在每个派生类中:
public override IMyNewServiceThingy GetService()
{
return Service;
}
在类上设置Service变量 - levlel是一个错误的决定,更糟糕的是,当你在创建派生类时重置它(在构造函数中) - 你永远不知道当前设置了哪个服务...(特别是在使用时) IOC或异步调用)
答案 1 :(得分:0)
我终于使用反射解决了这个问题(礼貌Manas Agarwal)
Class CurrencyConvertor cc;
cc = new Convertor-A();
BindingFlags flags = (BindingFlags.NonPublic | BindingFlags.Public | BindingFlags.Static | BindingFlags.Instance | BindingFlags.DeclaredOnly);
MethodInfo m = cc.type.GetMethod(MethodName, flags);
response = (string)m.Invoke(cc.Service, Parameters);