【问题标题】:Making auto generated partial class implement custom interface使自动生成的部分类实现自定义接口
【发布时间】:2011-09-07 07:14:06
【问题描述】:

最近我一直在从事 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

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

是否有可能完成这项工作?提前感谢您的任何提示和帮助!

【问题讨论】:

  • 你101%确定生成的类也在命名空间Project.Web.Models中吗?
  • 假设错误消息是逐字复制的,它是...
  • @jeroenh:不,你不能推断出来。错误消息指的是第二个代码片段中的类。我指的是第一个片段中的类(自动生成的)。
  • 这种模式(在设计器生成的部分类上实现接口)肯定适用于常规 .Net,所以问题可能与 Silverlight 有关。
  • @Jon 同意,对此感到抱歉

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


【解决方案1】:

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

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

【讨论】:

  • 迈克,注意“同一个项目”。你不能在不同的程序集中有部分类
【解决方案2】:

很可能,自动生成的类 SwitchDevicesealed 之一)不像 编写的类 SwitchDevice 那样不在命名空间 Project.Web.Models 中。 p>

要使部分类按预期工作,类定义的所有部分都应该在同一个命名空间中。否则,您在不同的命名空间中只有两个(不相关的)同名类,并且它们中的 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
    {
    }
}

【讨论】:

  • 我确实遇到了这个问题,您的解决方案有所帮助。奇怪的是,带有错误命名空间的 cs 文件(具有部分类的文件)也是由 VS 生成的。一定是某种错误。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2011-03-27
  • 1970-01-01
  • 1970-01-01
  • 2011-07-03
  • 1970-01-01
  • 2018-09-06
  • 2022-09-10
相关资源
最近更新 更多