在Windows Phone应用程序中,我使用来自不同提供商的多个Web服务。 为了绑定xaml中的数据,我有一个类来统治它们。让我们说:
public class Event
{
public string Id { get;set;}
public string Title { get;set;}
public string Latitude { get;set;}
public string Longitude { get;set;}
}
当提供商有一个网络服务时,我使用的方法如下:
private List<Event> MigrateCompanyEventToEvent(DataServiceCollection<CompanyEvent> collection)
{
var listEvents = new List<Event>();
foreach(var item in collection)
{
var ev = new Event();
ev.Id = item.itemId.ToString(); //typeof Guid();
ev.Title = item.companyEventTitle;
if(item.latitude != null) { ev.Latitude = item.latitude.ToString(); } //typeof double?
//etc.
listEvents.Add(ev);
}
return listEvents;
}
但是... 我有一个提供程序,有很多类似的Web服务。我不想为每个人编写一个方法,所以我看了泛型方法。我想我不明白。
我有一个名为KidEvents,ParentalEvents,SingleEvents的Web服务......所有这些服务具有相同的定义。所以,我写了一个接口:
public interface IdataEvents<T>
{
Guid entity_id {get;}
string nameEvent {get;}
double? latitude {get;}
double? longitude {get;}
}
继续我写道:
private List<Event> MigrateGenericOdataToEvent<T>(DataServiceCollection<T> collection) where T:IdataEvents<T>
{
var listEvents = new List<Event>();
foreach(T item in collection)
{
var ev = new Event();
ev.Title = item.nameEvent;
ev.Id = item.entity_id;
//etc.
listEvents.Add(ev);
}
return listEvents
}
我的问题是,当我使用时: var SingleEvents = MigrateGenericOdataToEvent(collection); //使用集合类型DataServiceCollection
我收到错误:
Le type 'm3.ServiceReferenceData.SingleEvents' ne peut pas être utilisé
comme paramètre de type 'T' dans le type ou la méthode générique
'm3.ViewModels.MainViewModel.MigrateGenericOdataToEvent<T>
(System.Data.Services.Client.DataServiceCollection<T)'.
Il n'y a pas de conversion de référence implicite de
'm3.ServiceReferenceData.SingleEvents' en
'm3.ViewModels.IdataEvents<m3.ServiceReferenceData.SingleEvents>'.
抱歉,这是法语...意思是:
The type 'm3.ServiceReferenceData.SingleEvents' can not be used as a paramater
of type 'T' in the type or generic method
'm3.ViewModels.MainViewModel.MigrateGenericOdataToEvent<T>
(System.Data.Services.Client.DataServiceCollection<T)'.
There is no implicit conversion reference of 'm3.ServiceReferenceData.SingleEvents'
in 'm3.ViewModels.IdataEvents<m3.ServiceReferenceData.SingleEvents>'
是否可以将SingleEvents,ParentalEvents,KidEvents(所有相同的数据模型)中的数据解析为一个通用事件?我该怎么办呢?
非常感谢
答案 0 :(得分:1)
您得到的错误是因为您的功能定义的这一部分:
where T:IGenericOdata<T>
(基于异常消息,我假设您的实际代码使用IdataEvents<T>
而不是IGenericOdata<T>
,否则异常没有多大意义。)
抱怨您的数据类型实际上并未实现约束中的接口。您已告诉编译器,只允许将实现该接口的内容用作T
,但您发送的类型不实现该接口。
如果这些类型来自自动生成的服务引用,您可以利用参考代码生成器将数据类型实现为部分类的事实,并通过简单地创建另一个来扩展它们以实现新的接口部分类文件。或者,您可以围绕每个服务引用类创建一个包装类,并在那里实现您的接口。