2013-07-17 31 views
1

我要訪問外部類的父類的方法(Web服務是在子類實例化)的方法(網絡服務)本地接口,可外接SOAP的Web服務(C#)

的情況是這樣的: 我有一個名爲ConvertCurrency的母類,它接收美元並給出盧比。例如, int ConvertCurrency(int dollars);

現在市場上有一個標準的供應商,它提供了一個軟件,任何人都可以在他的服務器上託管並創建一個web服務。因此,可以說它在兩個地方託管: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); 

但是,這不能編譯,因爲父類不知道所有的方法服務有它提供了以下錯誤:

「對象」不包含一個定義爲「GetSources」和沒有擴展方法'GetSources'接受類型'對象'的第一個參數可以找到(你是否缺少使用指令或程序集引用?)

我想知道什麼可以是這個問題的可能解決方案。當然,不需要爲兩個提供者中的每一個創建單獨的轉換函數。

如果我能以某種方式使「服務」對象知道它的接口(即函數簽名),它將工作得很好。

有沒有辦法解決這個問題?

+0

做轉換器A和B CurrencyConverter繼承? – Stephan

+0

是@Stephan。感謝您指出:)有更新代碼反映相同。 – texens

回答

0

我終於拿到了這個問題使用反射(禮貌瑪納斯阿加瓦爾)溶液

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); 
0

在CurrencyConvertor中創建一個名爲GetService()的抽象方法; 的派生類必須實現,他們返回該服務的方式這種方法...

在CurrencyConverter

public abstract IMyNewServiceThingy GetService(); 

的基類,現在可以使用這個類來獲得該服務,它調用方法

在每一個派生類:

public override IMyNewServiceThingy GetService() 
{ 
    return Service; 
} 

在類上設置Service變量 - levlel是一個糟糕的決定,更糟糕的是,當您在創建派生類時(在構造函數中)重置它時 - 您永遠無法知道當前設置了哪個Service(特別是。使用國際奧委會或異步調用)時

+0

我遇到的問題是這兩種服務的類型不同。 A用於link-A.service,B用於link-B.service(link-A和link-B指向我們添加兩個Web引用時獲得的兩個名稱空間)。現在,在基類中,我必須將其設置爲: public abstract Object GetServices(); 而在我的程序中,我這樣做: Object service = cc.GetService(); 現在,當我打電話任何方法服務,我會得到同樣的錯誤 - '對象'不包含'GetSources'的定義我是OOP的新手,所以請讓我知道如果我有曲解了你的soln。 – texens

+0

當對服務調用的方法具有相同的兩個服務(兩種類型)的簽名,然後爲這兩種方法創建一個公共接口,並返回..嗯,你可能有一些問題在這裏與自動生成的代碼.. - 不知道 – Stephan

+0

對不起..我忘了返回類型..對象不會讓你很遠(除非你想在基類中投射對象或使用反射來調用該方法 - 但這不是我認爲必要的) – Stephan