1

これが私が持っているものです:

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;
}

RenderPartialを実行して他のタイプ固有のフィールドを追加するときに、メインの編集フォームがIEventから継承するため、ASP.NETMVCでカスタムモデルバインダーに取り組んでいます。

モデルバインダーにたどり着くと、タイプのすべてのキー/値を確認できます。これは良いことです。今、私はこれをしたい:

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フィールドにアクセスできないということです。

私はこれを理解していますが、私が何をする必要があるのか​​理解できないようです。

4

2 に答える 2

3

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");
}
于 2010-02-22T15:21:09.990 に答える
2

これらの線に沿った何か:

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");
}
于 2010-02-22T15:22:53.913 に答える