使自动生成的分部类实现自定义接口

时间:2011-09-07 07:14:06

标签: c# c#-4.0 silverlight-4.0 entity partial-classes

最近我一直在开发一个Silverlight项目,其中有一个自动生成的类位于* File.Web.g.cs中,带有一个定义:

[DataContract(Namespace="http://schemas.datacontract.org/2004/07/Project.Web.Models")]
public sealed partial class SwitchDevice : Entity
{
        /// <summary>
        /// Gets or sets the 'ID' value.
        /// </summary>
        [DataMember()]
        [Editable(false, AllowInitialValue=true)]
        [Key()]
        [RoundtripOriginal()]
        public int ID
        {
            get
            {
                return this._id;
            }
            set
            {
                if ((this._id != value))
                {
                    this.OnIDChanging(value);
                    this.ValidateProperty("ID", value);
                    this._id = value;
                    this.RaisePropertyChanged("ID");
                    this.OnIDChanged();
                }
            }
        }
}

我想要做的是让SwitchDevice实现IDevice接口。代码位于另一个名为IDevice.cs的文件中。我决定将这样扩展分部类:

namespace Project.Web.Models
{
  public interface IDevice
  {
      int ID
      {
          get;
          set;
      }
   }

  public partial class SwitchDevice : IDevice
  {
  }
}

出于某种原因,VS2010没有看到位于Web.G.CS文件中的定义并生成错误:

  

'Project.Web.Models.SwitchDevice'没有实现接口   会员   'Project.Web.Models.IDevice.ID'PATH \ Project \ Interfaces \ ISwitchDevice.cs

我浏览并阅读了很多网页,但我还没有找到类似的问题。也许我只是做错了,我不是专家。

甚至可以使这项工作成功吗?提前感谢您提供任何提示和帮助!

2 个答案:

答案 0 :(得分:4)

你尝试做的很好,我一直这样做。

确保在同一项目内的同一名称空间下有两个部分类定义文件。您正在使用该类实现的接口可能在另一个程序集中,或者您失去了部分优势,并且无论如何都必须从调用代码引用您的dal,这是您设计可以给您的一件事;与DAL隔离并对接口进行编码。

答案 1 :(得分:2)

很可能,自动生成的类SwitchDevicesealed一个)不在名称空间Project.Web.Models中,就像你<的类SwitchDevice一样/ em>写道是。

要使部分类按预期工作,类定义的所有部分都应位于同一名称空间中。否则,您只有两个(不相关的)类在不同的名称空间中具有相同的名称,并且它们中的partial修饰符不起任何作用。

如果这是真的,你需要做的是将你自己的类片段移动到与自动生成的类相同的名称空间中,例如:

namespace Project.Web.Models
{
    public interface IDevice
    {
        int ID { get; set; }
    }
}

namespace Some.Namespace // copy the name from the auto-generated file
{
    public partial class SwitchDevice : Project.Web.Models.IDevice
    {
    }
}