【问题标题】:How to pass an Interface object to a WebMethod?如何将接口对象传递给 WebMethod?
【发布时间】:2010-12-02 13:59:23
【问题描述】:

我有一个带有 web 方法的 .Net web 服务,它以接口对象作为参数,每当我尝试访问该方法时,我都会收到异常消息:无法序列化成员 Product IProduct,因为它是一个接口。

有什么解决问题的建议吗??

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

【问题讨论】:

  • 想发布一些代码吗?
  • 我觉得这里没有具体说明的是,将接口作为 Web 方法签名的一部分公开是否合适?根据我的个人经验,这似乎不是。

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


【解决方案1】:

尝试在您的方法中添加 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 并传入具体类,它将能够识别类型。

【讨论】:

  • 如果我理解正确 只有产品可以用作 IProduct? FooProduct 和 BarProduct 呢?
  • 我想会有一个名为 Product 的基类。
  • 好的,这里的线程晚了,但是这与(抽象?)基类相比有什么优势?事实上,如果 Product 是基类,并且 IProduct 和 Product 之间的接口没有区别,那么您添加的工作似乎几乎没有收获。
  • @harper:哇很久以前,我从来没有真正建议过它比使用抽象类更有益。使用抽象基类而不是普通类很好,这只是意味着您总是必须从 Product 派生(在这种特殊情况下会很好)。上面是一个例子,产品可能有更多的属性/方法,所以使用接口只是限制哪些属性/方法暴露给特定方法的更好方法。使用接口(即使它模仿类)可以更轻松地在未来更改实现。
  • @James:但在这种情况下,您总是必须从模仿接口的基类继承,这似乎抵消了您可能获得的任何好处,因为接口直接与基类绑定XmlInclude 类。
【解决方案2】:

嗨,prashant,请尝试这样做..

代替这个

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

只需添加一个抽象类,因为您需要一个类型来序列化它..

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

【讨论】:

    猜你喜欢
    • 2023-03-06
    • 1970-01-01
    • 2017-03-02
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-06-05
    相关资源
    最近更新 更多