如何将Interface对象传递给WebMethod?

时间:2009-09-30 08:49:38

标签: c# .net web-services oop interface

我有一个带Web方法的.Net Web服务,它接受一个I​​nterface对象作为参数,每当我尝试访问该方法时,我都会遇到异常说: 无法序列化成员Product IProduct,因为它是一个接口。

任何解决问题的建议??

[WebMethod]
Public double CalculateTotal(IProduct product, int Quantity)
{
  return product.Price * Quantity;
}

2 个答案:

答案 0 :(得分:5)

尝试在方法中添加XmlInclude属性:

[WebMethod]
[XmlInclude(typeof(Product))]
Public double CalculateTotal(IProduct product, int Quantity)
{  
    return product.Price * Quantity;
}

修改

只是因为你对我使用“产品”这个类感到困惑。将此类替换为程序集中实现IProduct的任何类,例如

[Serializable]
public class Product : IProduct
{
     public Product(string name, double price)
     {
         this.Name = name;
         this.Price = price;
     }

     public string Name { get; private set; }
     public double Price { get; private set; }
}

public interface IProduct
{
    string Name { get; }
    double Price { get; }
}

....

[Web Method]
[XmlInclude(typeof(Product))]
Public double CalculateTotal(IProduct product, int quantity)
{
     return product.Price * quantity;
}

基本上,当您将接口传递给Web服务时,它无法找到任何架构,因此如果您使用XmlInclude attribute并传入具体类,它将能够识别该类型。

答案 1 :(得分:1)

你好,请尝试这样做..

代替这个

 [WebMethod]
    Public double CalculateTotal(IProduct product, int Quantity)
    {  
     return product.Price * Quantity;
    }

只需添加一个抽象类becoz,你需要一个类型来序列化它..

  [Serializable]
  public abstract class ProductAbstract : IProduct
  {
    // define all methods/attributes of interface IProduct here as abstract methods/attributes
  }


    [WebMethod]
    Public double CalculateTotal(ProductAbstract product, int Quantity)
    {  
       return product.Price * Quantity;
    }