如何在Web服务上使用自定义属性?

时间:2010-06-16 15:20:08

标签: c# properties attributes asmx

我目前正在尝试向Web服务中的属性添加自定义“列名”。这是我的课。

public class OrderCost
{ 
    public int OrderNum { get; set; }
    public int OrderLine { get; set; }       
    public int OrderRel { get; set; }
    public DateTime OrderDate { get; set; }
    public string PartNum { get; set; }
    public string Description { get; set; }
    public decimal Qty { get; set; }
    public string SalesUM { get; set; }
    public decimal Cost { get; set; }
    public decimal Price { get; set; }
    public decimal Net { get; set; }
    public decimal Margin { get; set; }
    public string EntryPerson { get; set; }
    public string CustID { get; set; }
    public string Customer { get; set; }
}

基本上我有另一个类(在Silverlight端)循环遍历所有属性并为每个属性创建一个列。事实是,我想使用除属性名称之外的其他名称。例如,我想显示“订单号”而不是OrderNum。我试图使用自定义属性,但似乎不起作用。有没有办法通过使用属性在Web服务上为这些属性提供不同的名称?还有另一种方法可以实现我想做的事情吗?

2 个答案:

答案 0 :(得分:0)

如果您正在寻找的是一种在服务器上控制此元数据而无需更新客户端应用程序的方法,那么我认为属性不是解决方案。首先,属性是在编译时定义的,我不认为你应该在运行时操作它们,即使你有能力这样做。但另一个问题是,Web服务实际上没有任何与.Net属性相对应的本机机制,因此没有内置的方式来传达这些属性所代表的元数据。

如果您确实希望通过属性定义此元数据,那么您可以将OrderCost类放在单独的共享程序集中,以供Web服务和客户端应用程序使用。这里的缺点是,如果要更改属性中定义的值,那么客户端应用程序在获得更新的DLL之前不会看到这些更改。

或者,如果您希望客户端应用程序完全不知道对元数据的任何更改,那么我会考虑创建某种Display类,其中包含您想要的显示信息并作为结果的一部分返回

例如,下面的代码显示了一个名为MyResultObject的类,它包含一个“Display”对象和一个“Data”对象列表。显然,这些类的名称空间,类名和组织由您决定:

namespace MyApplication
{
    public class MyResultObject
    {
        public Display.OrderCost Display { get; set; }

        public IList<Data.OrderCost> Data { get; set; }
    }
}

namespace MyApplication.Display
{
    public class Column
    {
        public string HeaderText { get; set; }
        public bool Visible { get; set; }
    }

    public class OrderCost
    {
        public Column OrderNum { get; set; }
        public Column OrderLine { get; set; }
        public Column OrderRel { get; set; }
        public Column OrderDate { get; set; }
        public Column PartNum { get; set; }
        public Column Description { get; set; }
        public Column Qty { get; set; }
        public Column SalesUM { get; set; }
        public Column Cost { get; set; }
        public Column Price { get; set; }
        public Column Net { get; set; }
        public Column Margin { get; set; }
        public Column EntryPerson { get; set; }
        public Column CustID { get; set; }
        public Column Customer { get; set; }
    }
}

namespace MyApplication.Data
{
    public class OrderCost
    {
        public int OrderNum { get; set; }
        public int OrderLine { get; set; }
        public int OrderRel { get; set; }
        public DateTime OrderDate { get; set; }
        public string PartNum { get; set; }
        public string Description { get; set; }
        public decimal Qty { get; set; }
        public string SalesUM { get; set; }
        public decimal Cost { get; set; }
        public decimal Price { get; set; }
        public decimal Net { get; set; }
        public decimal Margin { get; set; }
        public string EntryPerson { get; set; }
        public string CustID { get; set; }
        public string Customer { get; set; }
    }
}

我认为你应该问自己,如果服务对于如何显示其数据有任何了解是有意义的。相反,客户是否有必要消费它不理解的数据,这样它需要元数据才能正确处理数据?在某些情况下,这可能正是你想要做的,但可能不是在一般情况下,我认为。无论如何,这取决于您的应用程序的正确方法。

答案 1 :(得分:0)

不,客户端和服务之间既不能使用属性,也不能使用.NET特有的任何其他属性。请参阅“Basics: How Web Services Work”以了解原因。