C # дочерний класс теряет значение свойства - PullRequest
1 голос
/ 27 августа 2011

Из-за недавней проблемы, с которой я столкнулся несколько дней назад (вы можете проверить это сообщение здесь ), мне нужно было создать способ динамической ссылки на некоторые из моих таблиц linq to sql.Мне удалось сделать это с помощью абстрактного класса LogTable, который содержит все мои свойства LogTable, определенные в моем DataTable.Я смог сделать этот абстрактный способ, потому что мои LogTables имеют одинаковую структуру и, следовательно, одинаковые свойства.

Вот сокращенный код:

Абстрактный базовый класс

public abstract class LogTableStructure
{
        public int ID { get; set; }

        public datetime? LastAccess { get; set; }

        public string Username { get; set; }
}

Мой (сокращенный) динамический метод для обновления LogTable:

public void UpdateLog<T>(T currentLOG) where T : LogTableStructure
    {

        LogTableStructure logStructure = null;

        //LogTableEnum is defined on this class constructor
        switch (LogTableEnum)
        {
            case LogTableEnum.Log2009:
                logStructure = this.factory.LogDB.LOG_2009s
                    .SingleOrDefault(q => q.ID == currentLOG.ID);
                break;
            case LogTableEnum.Log2010:
                logStructure = this.factory.LogDB.LOG_2010s
                    .SingleOrDefault(q => q.ID == currentLOG.ID);
                break;
            case LogTableEnum.Log2011:
                logStructure = this.factory.LogDB.LOG_2011s
                    .SingleOrDefault(q => q.ID == currentLOG.ID);
                break;
   }
}

ПРОБЛЕМА

по какой-то причине параметр currentLOG выбрасывает нулевую ссылку времени выполненияисключение, даже если в нем заполнены все свойства LogTable.Я заметил, что с помощью дебаггера vs2010 все свойства currentLOG заполнены, но свойства базового класса (LogTableStructure) пусты, как если бы базовый объект был нулевым.

Я забываю что-нибудь о наследовании скрытия члена или что-то подобное?Я даже добавил модификатор new ко всем моим свойствам LogTable в моем .dbml, но даже это не решило проблему

Ответы [ 2 ]

1 голос
/ 27 августа 2011

Просто сделайте объект, в который вы вводите фактический экземпляр:

// This object is going to have to be a class that inherits from your abstract class
// It can't be a null object of the type of your abstract class.
var logStructure = new InstanceOfLogTableStructure();
logStructure.InjectFrom(currentLOG);

Это должно сделать это.

0 голосов
/ 27 августа 2011

Вы, похоже, неправильно заказали. Вы присваиваете null logStructure, затем вызываете InjectFrom для него. Только тогда вы назначаете фабрично созданный экземпляр этой переменной.

...