3

我有一个具有某些属性的 IList。我将一组值从数据库访问到返回 IList 的代码。我使用了一个 web 服务,它在列表中提供了完整的详细信息。作为 WCF 的服务在 WCFTestClient.exe 中执行得很好。但是在代码隐藏中,放置时会显示错误。

public IList<BrandInfo> SearchProduct(string name)
{
    AuthenicationServiceClient obj = new AuthenicationServiceClient();
    return obj.SearchProducts(name); 

}

它显示错误“ Cannot implicitly convert type 'Model.BrandInfo[]' to 'System.Collections.Generic.IList<Models.BrandInfo>'

Web服务中的代码。

public IList<BrandInfo> GetBrandByQuery(string query)
{
    List<BrandInfo> brands = Select.AllColumnsFrom<Brand>()
        .InnerJoin(Product.BrandIdColumn, Brand.BrandIdColumn)
        .InnerJoin(Category.CategoryIdColumn, Product.CategoryIdColumn)
        .InnerJoin(ProductPrice.ProductIdColumn, Product.ProductIdColumn)
        .Where(Product.EnabledColumn).IsEqualTo(true)
        .And(ProductPrice.PriceColumn).IsGreaterThan(0)
        .AndExpression(Product.Columns.Name).Like("%" + query + "%")
        .Or(Product.DescriptionColumn).Like("%" + query + "%")
        .Or(Category.CategoryNameColumn).Like("%" + query + "%")
        .OrderAsc(Brand.NameColumn.ColumnName)
        .Distinct()
        .ExecuteTypedList<BrandInfo>();

    // Feed other info here
    // ====================
    brands.ForEach(delegate(BrandInfo brand)
    {
        brand.Delivery = GetDelivery(brand.DeliveryId);
    });

    return brands;
}

我如何从客户端访问此代码。我无法为此提取任何相关的在线参考资料。

4

2 回答 2

6

我从您的错误消息中注意到的一件事是它明确指出:

无法将类型隐式转换'Model.BrandInfo[]''System.Collections.Generic.IList<Models.BrandInfo>'

Model.BrandInfoModels.BrandInfo与单独项目中定义的不同。编译器不会以这种方式做出等价。您必须在一个项目中声明它并在另一个项目中引用它,或者您必须自己编写一个映射器。

就像是

public IList<BrandInfo> SearchProduct(string name)
{
    AuthenicationServiceClient obj = new AuthenicationServiceClient();
    return obj.SearchProducts(name).Select(Convert).ToList(); 
}

public Models.BrandInfo Convert(Model.BrandInfo x)
{
    //your clone work here. 
}

或者您应该尝试一些自动映射的库,例如AutoMapperValueInjecter

于 2013-11-04T06:42:35.037 回答
4

您可以使用ToList以下方法做到这一点:

public IList<BrandInfo> SearchProduct(string name)
{
    AuthenicationServiceClient obj = new AuthenicationServiceClient();
    return obj.SearchProducts(name).ToList();
}

请记住,它需要using System.Linq在文件的顶部。

或者,您可以更改 WCF 配置以将集合反序列化为列表而不是数组。

如果您使用添加服务参考,您应该执行以下操作:

  • 右键单击服务引用并选择配置服务引用
  • Collection Type下拉列表中,选择正确的类型:类似于System.Collections.Generic.List
于 2013-11-04T06:22:12.820 回答