2

我有一个由代码模板自动生成的抽象类。然后我们有几个派生自这个类的类。该类有一个特定属性,对于其中一个派生实现,我想覆盖 getter 和 setter。不幸的是,我找不到覆盖该属性的方法,因为它没有被声明为虚拟的。

因此,作为另一种方法,我决定让属性受到保护,然后在部分类 ( .shared.cs) 中创建一个公共虚拟属性,该属性有效地包装了受保护的属性。然后我可以在一个特定的实现中覆盖它。

所以在服务器端这看起来不错,但是一旦我构建它,事实证明 ria 在客户端为我生成的部分共享文件似乎没有受保护属性的可见性。

ClassA.cs

//------------------------------------------------------------------------------
// <auto-generated>
//    This code was generated from a template.
//
//    Manual changes to this file may cause unexpected behaviour in your application.
//    Manual changes to this file will be overwritten if the code is regenerated.
// </auto-generated>
//------------------------------------------------------------------------------

namespace ABC.Web.Models.DomainModel
{
    using System;
    using System.Collections.Generic;
    using System.ComponentModel.DataAnnotations;

    [RoundtripOriginal]
    public abstract partial class ClassA
    {
        public int Id { get; set; }
        public string Title { get; set; }
        protected string ApplicationNumber { get; set; }
    }
}

ClassA.shared.cs

namespace ABC.Web.Models.DomainModel
{
    using System;
    using System.Collections.Generic;
    using System.Linq;
    using System.Runtime.Serialization;

    public abstract partial class ClassA
    {
        [IgnoreDataMember]
        public virtual string ApplicationNumberAccessor
        {
            get
            {
                return this.ApplicationNumber;
            } 
            set
            {
                this.ApplicationNumber = value;
            }
        }
    }
}

这有效地给出了错误'ABC.Web.Models.DomainModel.ClassA' does not contain a definition for 'ApplicationNumber' and no extension method 'ApplicationNumber' accepting a first argument of type 'ABC.Web.Models.DomainModel.ClassA' could be found (are you missing a using directive or an assembly reference?)

双击错误时,它会将我带到文件的客户端版本,由于某种原因它看不到该受保护的属性。

知道为什么吗?或者有没有办法(首先使用数据库)标记一个字段,使其生成为虚拟的?

4

1 回答 1

1

WCF RIA 不会在 中创建成员,Web.g.cs除非该成员已被序列化。作为ApplicationNumber受保护的属性,WCF RIA 会忽略它。这解释了为什么它在 Web 项目中编译,而不是在 Silverlight 中。

您是否尝试过共享其他部分而是添加属性?

将其更改为ClassA.csorClassA.partial.cs并将内容更改为:

namespace ABC.Web.Models.DomainModel
{
    using System;
    using System.Collections.Generic;
    using System.Linq;
    using System.Runtime.Serialization;

    public abstract partial class ClassA
    {
        // You _do_ want this serialized to the client and back
        // so remove the [IgnoreDataMember] atribute
        public virtual string ApplicationNumberAccessor
        {
            get
            {
                return this.ApplicationNumber;
            } 
            set
            {
                this.ApplicationNumber = value;
            }
        }
    }
}
于 2013-08-28T18:40:56.570 回答