0

在 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;
}

但是...我有一个提供许多类似网络服务的提供商。我不想为每个方法编写一个方法,所以我查看了泛型方法。我想我不明白一些事情。

我有一个名为 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(所有相同的数据模型)中的数据解析为一个通用事件?请问我该怎么做?

非常感谢

4

1 回答 1

1

您得到的错误是由于您的函数定义的这一部分:

where T:IGenericOdata<T>

(根据异常消息,我假设您的实际代码使用IdataEvents<T>and not IGenericOdata<T>,否则异常没有多大意义。)

它抱怨您的数据类型实际上并未实现您在约束中拥有的接口。您已经告诉编译器,只允许将实现接口的东西用作T,但是您发送的是不实现接口的类型。

如果这些类型来自自动生成的服务引用,您可以利用引用代码生成器将数据类型实现为分部类这一事实,并通过简单地创建另一个分部类文件来扩展它们以实现您的新接口. 或者,您可以围绕每个服务引用类创建一个包装类,并在那里实现您的接口。

于 2013-03-25T13:32:45.253 回答