У меня есть Linq to SQL DataContext с функциями SQL. Хотя полученный объект хорош, я хотел бы добавить свойство к объекту и в то же время сократить имя объекта. Итак, я создал объект Reminder, который наследуется от объекта Linq to SQL fnRTHU_ReminderByTaskResult с нужным мне свойством.
public class Reminder : fnRTHU_ReminderByTaskResult
{
public string MyProperty {get;set;}
}
Затем, когда функция привязывается к списку, я пытаюсь в файле aspx сделать:
<asp:Literal runat = "server" Text='<%# ((Reminder)DataBinder.Container).MyProperty %>' />
Где DataBinder.Container имеет тип fnRTHU_ReminderByTaskResult. Это приводит к InvalidCastException, неспособному привести тип объекта fnRTHU_ReminderByTaskResult к типу Reminder. Я не понимаю, так как я наследую от типа, из которого я выполняю приведение.





К сожалению, вы пытаетесь отказаться от того, что C# не поддерживает. Вы не можете выполнить приведение родительского типа к дочернему типу.
Вы определенно можете преобразовать родительский Справка в дочернюю ссылку, если базовый объект является дочерним (или дочерним по отношению к дочернему).
На самом деле это не имеет ничего общего с тем, что я сказал. Я сказал родительский "тип", а не родительскую "ссылку".
@Andrew, в вашем ответе говорится, что C# не поддерживает приведение вниз, которое он поддерживает.
Проблема в том, что вы пытаетесь преобразовать экземпляр базового класса в дочерний класс. Это недопустимо, потому что Child наследуется от Base. Нет никакой гарантии, что прецедент от Base to Child будет работать (это называется понижением). Броски вверх (от ребенка к базе) безопасны.
Это будет работать, если свойство Container является экземпляром Reminder. В данном случае это не так.
Получил два хороших ответа, но тот, который я выбрал в качестве возможного решения, которое будет реализовано, надеюсь, вы не возражаете, проголосовали за свой ответ.
Поскольку функция Linq to Sql возвращает этот базовый класс, ваш объект никогда не был объектом вашего производного класса. Следовательно, при попытке сбить с ног он не может этого сделать. Однако вы можете предоставить неявные и явные реализации приведения в своем классе, которые позволят этому приведению работать.
реализовано решение оператора: публичный статический неявный оператор Reminder (результат fnRTHU_ReminderByTaskResult)