【问题标题】:ToString Method Overriding in DataContract in WCFWCF 中 DataContract 中的 ToString 方法覆盖
【发布时间】:2012-05-01 16:53:12
【问题描述】:

即使我通过在类 ActivityType 中返回 ActivityType.Code 属性值来覆盖 DataContract 中的 ToString 方法。我仍然没有在客户端上获取用于绑定网格的 ActivityType.Code 属性值。能否告诉我如何将 ToString 方法提供给客户端。

这里是代码库

数据合同

  [DataContract]
    public class Activity
    {
        [DataMember]
        public ActivityType ActivityTypeId { get; set; }
        [DataMember]
        public string Code { get; set; }
        [DataMember]
        public string Description { get; set; }
        [DataMember]
        public EntityStatus Status { get; set; }

    }
    [DataContract]
    public enum EntityStatus
    {
        [EnumMember]
        Active = 0,
        [EnumMember]
        Inactive = 1
    }

    [DataContract]
    public class ActivityType
    {
        [DataMember]
        public string Code { get; set; }
        [DataMember]
        public string Name { get; set; }
        [DataMember]
        public string Description { get; set; }

        public override string ToString()
        {
            if (Code != null)
            {
                return Code.ToString(CultureInfo.InvariantCulture);
            }
            else
            {
                return base.ToString();
            }
        }
    }

服务实现

  public class TimeSheetManagementService : ITimeSheetManagementService
    {
        public List<BusinessEntities.Activity> GetActivities()
        {
            TimeSheetManagementDataController controller = new TimeSheetManagementDataController();


            var activities = controller.GetActivities();
            var activitiesresult = activities.Select(activity => new BusinessEntities.Activity()
                                                                     {
                                                                         ActivityTypeId =
                                                                             new BusinessEntities.ActivityType()
                                                                                 {
                                                                                     Code = activity.ActivityType.Code,
                                                                                     Description =
                                                                                         activity.ActivityType.
                                                                                         Description,
                                                                                     Name = activity.ActivityType.Name
                                                                                 },
                                                                         Code = activity.Code,
                                                                         Description = activity.Description,
                                                                         Status =  (EntityStatus)  Enum.Parse(typeof(EntityStatus),Convert.ToString((activity.Status==true)?1:0))
                                                                     });

            return activitiesresult.ToList();
        }
    }

客户端实现

<asp:GridView ID="GridView1" runat="server" AutoGenerateColumns="False">
            <Columns>
             <asp:BoundField runat="server" DataField="Code"/>

             <asp:BoundField runat="server" DataField="Description"/>

             <asp:BoundField runat="server" DataField="Status"/>

             <asp:BoundField runat="server" DataField="ActivityTypeId"/>
            </Columns>
        </asp:GridView>

输出

  Code Description                   Status    ActivityTypeId
    ACT2    Requirement Feasibility Study Inactive TimeSheetManagementServiceRef.ActivityType
    ACT1    Requirement analysis    Inactive     TimeSheetManagementServiceRef.ActivityType

【问题讨论】:

  • 感谢您的参考,但那些参考解决方案说我们应该有代理类,但是当我在网站项目中创建服务参考时它只是创建了 XSD 文件,我是否需要显式创建代理类使用 SvcUtil.exe 。在设置服务引用时,无法使用 Visual Studio 2010 本身生成它。请建议
  • 我通常使用这些协定创建一个类库,并在您的服务和应用程序中引用这个类库。

标签: wcf datacontract


【解决方案1】:

数据合约用于传输数据,而不是用于传输逻辑。当您使用添加服务引用、添加 Web 引用、xsd.exe、wsdl.exe 或 svcutil.exe 时,仅描述了属性 - 您在服务器上声明的所有方法都将丢失。有两种方法可以解决这个问题:

  • 丑陋的方式:在服务和客户端之间通过数据契约共享库,而不是通过上述工具之一在客户端上创建新类型
  • 这些工具应该创建部分类。您的ToString 方法显然属于客户端,因为它与数据呈现相关,因此请在客户端创建合约类的第二部分并在该类中声明ToString 方法。

【讨论】:

    猜你喜欢
    • 2012-06-06
    • 2013-04-13
    • 1970-01-01
    • 2018-01-10
    • 2018-07-05
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-08-28
    相关资源
    最近更新 更多