Как я могу расширить класс LINQ-to-SQL без необходимости вносить изменения каждый раз, когда генерируется код? - PullRequest
3 голосов
/ 10 мая 2010

Обновление от комментария:

Мне нужно расширить классы linq-to-sql собственными параметрами и не хочу касаться каких-либо сгенерированных классов. Любые лучшие предложения приветствуются. Но я также не хочу делать все атрибуты снова и снова, если классы linq-to-sql меняются. поэтому, если vstudio генерирует новый атрибут для класса, у меня есть свои собственные расширенные атрибуты, которые хранятся отдельно, а новый интерилируется из самого класса


Оригинальный вопрос:

Я не уверен, возможно ли это. У меня есть классная машина и классная машина, расширенная с классной машины. Класс mycar также имеет список строк. Единственная разница.

Как теперь я могу привести любой автомобильный объект к объекту mycar, не назначая все Атрибуты каждый от руки. Как:

Car car = new Car();

MyCar mcar = (MyCar) car;

или

MyCar mcar = new MyCar(car);

или, тем не менее, я могу расширить автомобиль с помощью собственных переменных и не всегда делать это

Car car = new Car();
MyCar mcar = new MyCar();
mcar.name = car.name;
mcar.xyz = car.xyz;
...

Спасибо.

Ответы [ 4 ]

17 голосов
/ 10 мая 2010

В ответ на ваш комментарий к вопросу классы Linq-To-Sql генерируются как частичные. Это означает, что вы можете иметь отдельные файлы кода с одинаковыми именами классов, объявленными как частичные, для добавления дополнительных свойств, которые вы хотите.

например. Ваш класс дизайнера Ling-To-Sql будет:

public partial class Car
{
     .... lots of auto generated stuff ....
}

Вы можете иметь свой собственный отдельный файл (в том же проекте) с именем Car.cs:

public partial class Car
{
     public MyCustomStuff{ get; set; }
}

И эти два класса будут объединены. Просто убедитесь, что они находятся в одном и том же пространстве имен.

2 голосов
/ 10 мая 2010

Вы можете создать конструктор копирования, принимающий параметр базового класса в производном классе:

class MyCar {
    public MyCar(Car car) {
        name = car.name;
        // etc
    }
}
1 голос
/ 10 мая 2010

вы не можете определенно разыграть Car как MyCar, потому что нет никакой гарантии, что Car является MyCar. Вы можете попробовать приведение и посмотреть, работает ли оно, или вы можете использовать ключевое слово as, чтобы выполнить приведение и получить нулевое значение в случае сбоя.

Как свойства устанавливаются в Car? Почему MyCar не может просто использовать ту же технику для установки его свойств? Ведь это Car. Почему вы хотите создать MyCar из Car? Почему бы просто не создать MyCar во-первых?

Вы также можете создать конструктор в MyCar, который принимает Car и назначать свойства MyCar свойствам Car в конструкторе.

Вы могли бы также рассмотреть возможность использования шаблона декоратора в качестве альтернативы подклассу, и ваш MyCar делегировал вызовы для упакованного Car

0 голосов
/ 10 мая 2010

Есть несколько вариантов, которые вы можете использовать:

  • неявный или явный оператор
    public static explicit operator Car(MyCar source)

  • конструктор копирования
    public MyCar(Car source)

  • метод расширения
    public static class CarExtensions {<br> public static MyCar Create(this Car source) }

...