在接口的实现中修改特定于类型的属性

时间:2010-02-22 15:13:56

标签: c# asp.net-mvc oop inheritance model-binding

我知道这是一个愚蠢的问题,因为答案可能是“哦,当然!”之一。

这就是我所拥有的:

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 个答案:

答案 0 :(得分:3)

首次创建BirthdayEventMeetingEvent的实例时,请将它们放在该类型的变量中。这样你就可以分配这些成员了。然后将它们分配给您的_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");
}

答案 1 :(得分: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");
}