在某些場合中,我們需要提供以object為引數的方法。不過在wcf中,由於需要序列化與反序列化,因此它要求所有wcf傳遞的引數型別都是已知的,無法傳遞object這種未知型別。即使用了knowntype來標記自定義物件,也無法呼叫。以下**無法正常執行:
[datacontract]
public class product
[servicecontract]
public inte***ce iproductinfo
[knowntype(typeof(product))]
public class productinfo : iproductinfo
}呼叫時:
productinfoclient client = new productinfoclient ();
client.getproducttypename("傳字串型別,呼叫成功");
client.getproducttypename(new product()); //報錯
不過,可以通過定義乙個中間型別來傳遞object物件。方法就是在這個型別中包含乙個object的成員,並且定義該成員為knowntype。**如下:
[datacontract]
[knowntype(typeof(product))] //必須標記product型別
public class requestdata
通過傳遞requestdata,就能變相實現object物件的傳遞。
[servicecontract]
public inte***ce iproductinfo
public class productinfo : iproductinfo
}不過,你會發現任何自定義物件都必須在requestdata中預先設定為knowntype,否則wcf無法序列化。這顯然還不夠靈活。為了讓方法可以方便的呼叫,而不需要擔心是否標記了knowntype,我們可以通過定義乙個方法並把這個方法名作為knowntype引數來解決此問題。這裡用到knowntype的另乙個過載方法:
knowntypeattribute(string methodname);
這個方法必須滿足以下條件:
a 必須是static,因為需要在物件例項化之前呼叫。
b 必須是不帶任何引數的。
c 返回型別必須是可被ienumerable接受的,(也就是實現了ienumerable介面的)。
改造後requestdata如下:
[datacontract]
[knowntype("getknowntype")]
public class requestdata
[datamember]
public object requestobject;
private static type getknowntype()
}
在getknowntype函式中,程式將自定義型別的程式集包含的型別全部返回,這下就省事多了。。
解決WCF介面無法傳遞object引數的問題
在某些場合中,我們需要提供以object為引數的方法。不過在wcf中,由於需要序列化與反序列化,因此它要求所有wcf傳遞的引數型別都是已知的,無法傳遞object這種未知型別。即使用了knowntype來標記自定義物件,也無法呼叫。以下 無法正常執行 呼叫時 不過,可以通過定義乙個中間型別來傳遞ob...
x介面無法進入的解決方法
錯誤的一部分如下所示 ww vmware 0 failed to set up write combining range 0xf0000000,0x1000000 could not init font path element unix 7100,removing from list fatal...
USB介面無法識別裝置
小瓊子 提問 2011年12月31日 問題 usb介面無法識別裝置 我的電腦usb介面開機正常的用了一段時間後就不正常了,插入u盤 手機 銀行u盾就無法識別了。原來插入電腦的usb裝置拔了電腦上的裝置圖示還是有的 解答 已由 paco wang 解答 2012年1月11日 解答 你好,請問接入u盤等...