Когда вы вызываете .GetType()
, вы получаете тип времени выполнения объекта. Компилятор C # не знает, какой тип времени выполнения будет у вашего объекта. Он только знает, что ваш объект будет иметь тип, производный от tblAppointment
, потому что вы так сказали в объявлении метода, поэтому статический тип возвращаемого значения - tblAppointment
. Поэтому tblAppointment
- это все, к чему вы можете получить доступ, если только вы не используете приведение, чтобы сообщить компилятору «Я знаю, что во время выполнения эта ссылка будет ссылаться на объект этого типа, вставьте проверку во время выполнения и дайте мне ссылку с этим статическим тип ».
Статическая типизация - это разница между типами, известными во время компиляции и во время выполнения. Если вы пришли из динамически типизированного языка, такого как Smalltalk или Javascript, вам придется внести немало корректировок в свои привычки программирования и мыслительные процессы. Например, если вам нужно что-то сделать с объектом, который зависит от его типа во время выполнения, решение часто состоит в том, чтобы использовать виртуальные функции - они распределяются по типу времени выполнения объекта.
Обновление: в вашем конкретном случае используйте виртуальные функции, это именно то, для чего они были созданы:
class tblAppointment
{
protected abstract void ProcessAppointment () ;
}
sealed class tblBirthAppointment
{
protected override void ProcessAppointment ()
{
// `this` is guaranteed to be tblBirthAppointment
// do whatever you need
}
}
...
Тогда используйте
// will dispatch on runtime type
appointmentsRepo.GetAppointment (id).ProcessAppointment () ;