2

コード テンプレートによって自動生成される抽象クラスがあります。次に、このクラスから派生するいくつかのクラスがあります。そのクラスには、派生実装の 1 つでゲッターとセッターをオーバーライドしたい特定のプロパティがあります。残念ながら、仮想と宣言されていないため、プロパティをオーバーライドする方法が見つかりません。

別のアプローチとして、プロパティを保護し、部分クラス ( .shared.cs) で、保護されたものを効果的にラップするパブリック仮想プロパティを作成することにしました。次に、1 つの特定の実装でこれをオーバーライドできます。

したがって、サーバー側では問題ないように見えますが、ビルドすると、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.csApplicationNumber保護されたプロパティであるため、WCF RIA はそれを無視します。これは、Silverlight ではなく Web プロジェクトでコンパイルされる理由を説明しています。

他のパーシャルを共有するのではなく、代わりにプロパティを追加しようとしましたか?

ClassA.csまたはに変更しClassA.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 に答える