有一个WCF服务:
public List<Aktivy> Aktivy()
{
DataClassesDataContext db = new DataClassesDataContext();
var aktivy = from akt in db.Aktivys
select aktivy;
return aktivy.ToList();
}
还有一个访问WCF服务的Silverlight客户端:
private void Grid_Loaded(object sender, System.Windows.RoutedEventArgs e)
{
ServiceReference.ServiceClient webService = new ServiceReference.ServiceClient();
webService.AktivyCompleted += new EventHandler<ServiceReference.AktivyCompletedEventArgs>(webService_AktivyCompleted);
webService.AktivyAsync();
}
void webService_AktivyCompleted(object sender, ServiceReference.AktivyCompletedEventArgs e)
{
}
如何在客户端List<Aktivy>
转换e.Result(功能为webService_AktivyCompleted)?
答案 0 :(得分:4)
默认情况下,在Silverlight中配置服务引用时,集合类型将设置为反序列化为ObservableCollection<T>
(不是List<T>
)。如果您总是想要一个简单的List<T>
,您可以修改服务引用的配置(在解决方案资源管理器中右键显示服务)并将集合设置为List<T>
。
然而,处理这些事情时更好的方法是使用接口而不是要求特定类型。修改您的代码以使用IList<T>
(ObservableCollection<T>
实现IList<T>
)而不是List<T>
,这将适用于可以为其配置服务的任何可能的集合类型
由于ObservableCollection<T>
是最常用的选项,因此您必须有充分理由将集合设为List<T>
。一个原因可能是因为您在服务器和客户端之间共享代码。
答案 1 :(得分:3)
如何将e.Result投射到List?
var listOfAktivy = (List<Aktivy>)e.Result;
无论如何,您可以在观看/快速观看窗口中查看e.Result的类型。
答案 2 :(得分:0)
我认为这取决于您如何配置客户端以在服务引用中生成集合类型。
默认情况下,客户端将根据我认为的wsdl中的定义生成简单数组,但可以将其配置为生成List(通过将添加服务引用对话框的高级选项卡中的选项Collection类型更改为System)。 Collections.Generic.List)。
你有这样的方式我认为这会有效(但我没有测试过它:
List<Aktivity> listOfAktivy = new List<Aktivy>((IEnumerable<Aktivity>)e.Result);