Изменение типоспецифических свойств в реализации интерфейса - PullRequest
1 голос
/ 22 февраля 2010

Я знаю, что это глупый вопрос, потому что ответ, скорее всего, «о, конечно!» один.

Вот что у меня есть:

public interface IEvent {
  int Id
  string Title

}

public class MeetingEvent : IEvent {
  int Id
  string Title

  //Meeting Properties
  string Room;
  User Organizer; 
}

public class BirthdayEvent : IEvent {
  int Id
  string Title

  //Bday Properties
  int Candles;
  bool Surprise;

}

Я работаю над настраиваемым механизмом связывания моделей в ASP.NET MVC, поскольку моя основная форма редактирования наследуется от IEvent, а я выполняю RenderPartial для добавления других специфических для типа полей

Когда я добираюсь до подшивки модели, я вижу все ключи / значения для типа, что хорошо. Теперь я хочу сделать это:

IEvent _event;

switch (eventType) {  // EventType is an enum
  case EventType.Birthday:
    _event = new BirthdayEvent();

    _event.Candles= GetValue<int>(bindingContext, "Candles");
    _event.Surprise= GetValue<bool>(bindingContext, "Surprise");
    break;

  case EventType.Meeting:
    _event = new MeetingEvent();

    // Meeting-specific fields are set here...
    break;

  default:
    throw new InvalidOperationException("Invalid Event Type");
}

По сути, мне нужна переменная IEvent, и я хочу создать определенный тип события, который реализует IEvent и установить поля, специфичные для типа. Visual Studio говорит мне, что она не может получить доступ к полям BirthdayEvent.

Хотя, я понимаю это, я не могу понять, что мне нужно делать. Таким образом, этот вопрос:).

Заранее спасибо!

Ответы [ 2 ]

3 голосов
/ 22 февраля 2010

Когда вы впервые создаете свои экземпляры BirthdayEvent и MeetingEvent, поместите их в переменные этого типа. Таким образом, вы можете назначить этих членов. Затем присвойте их вашей переменной _event. Как это:

switch (eventType) {  // EventType is an enum
  case EventType.Birthday:
  {
    var be = new BirthdayEvent();

    be.Candles= GetValue<int>(bindingContext, "Candles");
    be.Surprise= GetValue<bool>(bindingContext, "Surprise");
    _event = be;
    break;
  }
  case EventType.Meeting:
  {
    var me = new MeetingEvent();

    // Meeting-specific fields are set here...
    _event = me;
    break;
  {
  default:
    throw new InvalidOperationException("Invalid Event Type");
}
2 голосов
/ 22 февраля 2010

Что-то вроде этого:

IEvent _event;

switch (eventType) {  // EventType is an enum
  case EventType.Birthday:
    var birthdayEvent = new BirthdayEvent();

    birthdayEvent.Candles= GetValue<int>(bindingContext, "Candles");
    birthdayEvent.Surprise= GetValue<bool>(bindingContext, "Surprise");
    _event = birthdayEvent;
    break;
  /* etc */

  default:
    throw new InvalidOperationException("Invalid Event Type");
}
...