2012-07-24 179 views
1

我有一個有趣的問題,它超越了我的C#舒適區。通過使用WsdlImporter和CodeDomProvider類動態檢查Web服務WSDL,我可以生成並編譯客戶端代理代碼到程序集到Web服務。這包括聲明如下服務客戶端類:C#cast泛型類型

public partial class SomeServiceClient : System.ServiceModel.ClientBase<ISomeService>, ISomeService {...} 

注意,客戶端類和ISomeService合同名稱的名稱是動態的 - 我不知道他們提前。我可以實例化這個類動態使用的對象:

string serviceClientName = "SomeServiceClient";// I derive this through some processing of the WSDL 
object client = webServiceAssembly.CreateInstance(serviceClientName , false, System.Reflection.BindingFlags.CreateInstance, null, new object[] { serviceEndpoint.Binding, serviceEndpoint.Address }, System.Globalization.CultureInfo.CurrentCulture, null); 

但是,如果我需要在這個客戶端類設置ClientCredentials,那麼我可以不知道如何做到這一點。我認爲我可以將客戶端對象轉換爲System.ServiceModel.ClientBase泛型類,然後引用ClientCredentials屬性。但是,下面的編譯但無法在運行:

System.Net.NetworkCredential networkCredential = new System.Net.NetworkCredential(username, password, domain); 
((System.ServiceModel.ClientBase<IServiceChannel>)client).ClientCredentials.Windows.ClientCredential = networkCredential; 

是否有某種方式來動態指定演員,或者是有一些方法來設置憑據沒有這個投?謝謝你的幫助!馬丁

+1

可以請你分享你得到的例外嗎? – Artak 2012-07-24 03:45:19

+0

恐怕我現在不在我的開發機器中,但是從內存中,異常是這樣的:SomeServiceClient不能轉換爲System.ServiceModel.ClientBase user304582 2012-07-24 04:50:08

+0

嗨 - 這裏是異常的確切形式:無法轉換類型'SomeServiceClient'的對象以鍵入'System.ServiceModel.ClientBase'1 [System.ServiceModel.IClientChannel]'。 – user304582 2012-07-24 14:39:12

回答

2

如果您有共享的例外,我們可以幫你更好的幫助,但是這是我猜:

你的類層次結構是這樣的:

public interface ISomeService : System.ServiceModel.IServiceChannel 
{ 
    ... 
} 

public class SomeServiceClient : System.ServiceModel.ClientBase<ISomeService> 
{ 
} 

和你想投SomeServiceClientSystem.ServiceModel.ClientBase<IServiceChannel>。可悲的是,你不能那樣做,C#4有一個叫做Covariance的特性,它允許上傳泛型類型參數,但只適用於接口,不適用於具體的類。

所以其他選項是使用反射:

ClientCredentials cc = (ClientCredentials)client.GetType().GetProperty("ClientCredentials").GetValue(client,null); 
cc.Windows.ClientCredential = networkCredential; 

這應該沒有問題的工作(我沒有測試過,所以如果它不工作,告訴我的問題,所以我可以修復它) 。

+0

嗨 - 謝謝 - 是的,反思應該這樣做。我明天就去試試看,如果有效的話,接受答案吧! – user304582 2012-07-24 07:32:15