Заставить автоматически сгенерированный частичный класс реализовать собственный интерфейс - PullRequest
1 голос
/ 07 сентября 2011

В последнее время я работаю над проектом 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 ]

4 голосов
/ 07 сентября 2011

то, что вы пытаетесь сделать, прекрасно, и я делаю это все время.

Убедитесь, что у вас есть оба файла определения частичных классов в одном пространстве имен И внутри одного и того же проекта.интерфейс, который вы реализуете с этим классом, вероятно, будет находиться в другой сборке, или вы потеряете часть преимуществ, и вам все равно придется ссылаться на ваш dal из вызывающего кода, и это одна вещь, которую вы можете разработать;изоляция от DAL и кодирование по интерфейсам.

2 голосов
/ 07 сентября 2011

По всей вероятности, автоматически сгенерированный класс SwitchDevice (sealed один) не находится в пространстве имен Project.Web.Models, как класс SwitchDevice, который вы написал.

Чтобы частичные классы работали так, как вы ожидаете, все части определения класса должны находиться в одном пространстве имен.В противном случае у вас просто есть два (не связанных) класса с одинаковыми именами в разных пространствах имен, и модификатор 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
    {
    }
}
...