Переопределить виртуальные методы в генерируемых частичных классах - PullRequest
2 голосов
/ 17 октября 2011

В моем классе генерации LINQ у меня есть этот метод:

[global::System.Data.Linq.Mapping.ColumnAttribute(Storage="_Id",
             AutoSync=AutoSync.OnInsert, DbType="Int NOT NULL IDENTITY", 
             IsPrimaryKey=true, IsDbGenerated=true)]
public int Id
{
    get
    {
        return this._Id;
    }
    set
    {
        if ((this._Id != value))
        {
            this.OnIdChanging(value);
            this.SendPropertyChanging();    
            this._Id = value;            
            this.SendPropertyChanged("Id");
            this.OnIdChanged();
        }
    }
}

В моем закодированном частичном классе я расширяюсь от базового класса. Базовый класс определяет:

public virtual int Id { get; set; }

Концепция заключается в том, что я могу добавить Equals и Hashcode на уровне базового класса, а также некоторые другие функции на уровне базового класса. Проблема в том, что сгенерированные классы (из LINQ-to-SQL) не получают ключевое слово override, поэтому оно не работает. Если бы у него было override, я бы все настроил.

Пожалуйста, предложите, как это сделать.

Ответы [ 3 ]

0 голосов
/ 17 октября 2011

Я бы создал класс-оболочку для этого.

0 голосов
/ 17 октября 2011

Вы можете сделать базовый класс abstract, и тогда свойство Id станет

public abstract int Id { get; set; } 

Сгенерированный код будет реализовывать это абстрактное свойство.

0 голосов
/ 17 октября 2011

Частичный класс отличается от переопределения класса.С неполным классом вы просто говорите.Хорошо, у меня есть 1 класс, но я разделил исходный код на несколько файлов (в основном по понятным причинам, таким как выделение автоматически сгенерированного кода из вашего собственного кода).Компилятор C # просто объединяет каждую часть частичного класса и угрожает ему как 1 классу.Конечно, переопределение класса означает, что вы создаете новый класс, который принимает характеристики базового класса.Это совсем другое.

Теперь возможно, но не так легко указать EF, как генерировать код (при условии, что вы используете EF).Однако вы можете изменить один из базовых классов, чтобы он не работал с идентификатором свойства, а использовал более узнаваемое (и конкретное?) Имя, например «CompareIdentifier».При этом вы можете переопределить CompareIdentifier в своем производном классе для возврата автоматически сгенерированного идентификатора.И, конечно же, вся работа по сравнению с CompareIdentifier

...