2010-02-22 57 views
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; 

}

我在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字段。

虽然,我明白这一点,我似乎无法弄清楚我需要做什么。因此,这个问题:)。

在此先感谢!

回答

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"); 
} 
+0

变种!真棒,Keltex,谢谢:) – Dan 2010-02-22 15:25:36

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